Seră inteligentă cu monitorizare video [301873]
[anonimizat], Telecomunicații și Tehnologia Informației
programul de studii Electronică Aplicată
Conducător științific Absolvent
Ș.L.Dr.Ing. [anonimizat] 2020
Cuprins
Lista figurilor
Figura 1-1 Prezentare Raspberry Pi și numerotarea pinilor 18
Figura 1-2 Senzorul de umiditate a solului de tip rezistiv 19
Figura 1-3 Pompa de curent continuu ………………………………………………………………………………20
Figura 1-4 Driver-ul de motor dual în punte H 20
Figura 1-5 Prezentare DHT11 21
Figura 1-6 Modulul de camera pentru Raspberry Pi V2 22
Figura 2-1 Contul creat asociat 26
Figura 2-2 Autentificare sSMTP 27
Figura 2-3 Testare mail 28
Figura 3-1 Urmărirea umiditatii solului 29
Figura 3-2 Schema electrică pentru udarea plantelor 30
Figura 3-3 Organigrama software pentru udarea plantelor 32
Figura 3-4 [anonimizat] 34
Figura 4-1Schema electrică pentru iluminarea plantelor 37
Figura 4-2 Organigrama software pentru iluminarea plantelor 38
Figura 4-3 [anonimizat] 39
Figura 5-1Schema sistemului de monitorizare 41
Figura 5-2 Organigrama software pentru monitorizarea temperaturii 43
Figura 5-3 Notificari sera și alerte sera pentru temperatura și umiditate 45
Figura 5-4 Gasirea adresei IP locale 47
Figura 5-5 [anonimizat] 48
Figura 5-6 [anonimizat] 48
Figura 5-7 Captura extrasa din transmisiunea video 49
Figura 5-8 Principiul de masurare al inaltimii plantelor 50
Figura 5-9 Prelucrari ale imaginii realizate pe Planta 1 52
Figura 5-10 Prelucrari ale imaginii realizate pe Planta 2 53
Figura 5-11 Comparatie detectare intre Planta 1 și Planta 2 54
Figura 5-12 Solutie detectare pentru Planta 2 54
Figura 5-13 Exemple de detectare pentru obiectul cunoscut 55
Figura 5-14 [anonimizat] 56
Figura 5-15 Mail-uri pentru masurea plantei 57
Figura 6-1 Conceptul de realizare fizică a serei 59
Figura 6-2 Schema electrică a proiectului 60
Figura 6-3 Mail-urile de notificare 62
Figura 6-4 Realizarea finala a proiectului ………………………………………………………………………….62
Figura C-1 [anonimizat] 1 79
Figura C-2 [anonimizat] 2 79
Figura D-1 Diagrama Gantt a lucrarii 81
Lista tabelelor
Tabel 3-1 Observarea solului pe o perioada de 3 saptamani 29
Tabel 3-2 [anonimizat] 34
Tabel 5-1 Cazurile de temperatura și umiditate și tratarea lor 42
Tabel B-1 Imagini captate la masurarea Plantei 1 74
Tabel B-2 Lungime inregistrata la masurarea Pantei 1 75
Tabel B-3 Imagini inregistrate la masurarea Plantei 2 76
Tabel B-4 Lungime inregistrata la masurarea Plantei 2 77
Tabel B-5 Masurare și detectare defectuasa Planta 3 78
[anonimizat]: [anonimizat]
– CPU: [anonimizat]
– CSI: [anonimizat]
– GND: Ground – împământare
– GPIO: General-Purpose Input/Output – intrări/ieșiri cu scop general
-HTTP: Hypertext Transfer Protocol – protocol de transfer al hipertextelor
-IoT: Internet of Things – Internetul lucrurilor
-IP: Internet Protocol – protocol de internet
-JPEG: Joint Photographic Experts Group – grupul experților în fotografie reunit
-LAN: Local Area Network – rețea locala
-LED: Light-Emitting Diode – dioda emițătoare de lumina
-MJPEG: Motion JPEG – JPEG în mișcare
-OSI: Open System Interconnection – interconectarea sistemelor deschise
-RAM: Random Access Memory – memorie cu acces aleator
-RH: Relative Humidity – umiditate relativă
-SBC: Single Board Computer – calculator realizat pe o singura placa
-SMTP: Simple Mail Transfer Protocol – protocol de transfer mail simplu
-TCP: Transmission Control Protocol – protocol de transmisie cu control
-UDP: User Datagram Protocol – protocolul datagramelor utilizator
-USB: Universal Serial Bus – bus serial universal
-VGA: Video Graphic Array – matrice grafica video
-VPN: Virtual Private Network – rețea privata virtuala
Introducere
Creșterea plantelor este o activitate plăcută și apreciată pe scară largă, însă un program bine stabilit pentru întreținerea acestora este greu de menținut si urmat. Viața cotidiană nu permite multora timp pentru pasiuni sau activități de recreere, din acest motiv sistemele automate sunt din ce în ce mai căutate și mai ușor de utilizat. Sistemele automate au rolul de a facilita anumite procese, dându-i utilizatorului mai multă libertate în proiectele sale, mai multe opțiuni dar si mai multă încredere în activitatea întreprinsă, deoarece este asistat permanent.
Multe persoane ar dori sa aibă o mica grădină în propria lor casa, dar responsabilitatea în plus și realizarea unui program de udare a plantelor sau mutarea lor într-un loc mai luminos atunci când este întuneric, duc la scăderea numărului de oameni care cresc plante. Lipsa unei bune maniere de îngrijire a plantelor duce de asemenea la moartea sau îmbolnăvirea plantelor, care vor fi mai apoi abandonate de către proprietar.
Lucrarea își propune rezolvarea acestor probleme întâmpinate de persoanele care doresc o mica gradina accesibilă, fără a depune prea mult efort. Sera inteligenta cu monitorizare video, bazată pe Raspberry Pi are menirea de a facilita creșterea si îngrijirea plantelor, menținând condițiile optime pentru plante, fără intervenția utilizatorului. Legătura cu utilizatorul va fi realizată în contul personal de mail al acestuia, metodă care nu necesita descărcarea altor aplicații sau programe. Este un mediu la care majoritatea persoanelor au acces și știu cum sa-l acceseze și folosească.
Temperatura și umiditatea aerului vor fi măsurate la o ora setată de utilizator, datele vor fi prelevate și reținute pentru a fi transmise utilizatorului. Aceste date vor fi analizate și se vor trimite alerte către utilizator pentru cazurile cu temperatura prea ridicata sau umiditate ce ar putea pune planta în pericol. Monitorizarea temperaturii și a umidității aerului, are ca scop principal protejarea plantei și prevenirea îmbolnăvirii acesteia.
Se va tine cont de condițiile de lumina ambientala și umiditate a solului și se va aprinde o bara de LED-uri, respectiv se va acționa o pompa, pentru iluminarea și udarea plantelor. Toate acestea se vor aduce la cunoștința utilizatorului prin mail-uri de notificare către acesta.
Progresul și creșterea plantelor vor fi urmărite cu o camera montată în proximitatea plantelor care va măsura înălțimea și va retine datele. Măsurarea plantelor se va face automat, captând o imagine care urmează a fi prelucrată și apoi analizată. Lungimea plantei va fi transmisa utilizatorului prin email la fel ca orice alta schimbare în parametrii serei sau o acțiune întreprinsă pentru remedierea factorilor de mediu.
Utilizatorul va putea vedea plantele în timp real oricând dorește tot prin intermediul camerei. Se va realiza o transmisiune video accesibilă utilizatorului atât pe un browser web cât și pe telefonul mobil. Aceasta monitorizare are ca scop aducerea în atenția utilizatorului a defectelor plantei ce pot fi recunoscute doar dacă acesta examinează planta. Prin intermediul transmisiunii video acesta va putea examina, în detaliu planta fără a fi necesar sa se afle fizic lângă aceasta.
Lucrarea este structurata în șase capitole. Primul capitol prezintă componentele hardware utilizate, pentru realizarea fizică a serei. Al doilea capitol prezintă tehnicile software, pregătirea sistemului de operare și limbajul de programare utilizat. Al treilea capitol va descrie procedura de udare a plantelor, iar capitolul patru va prezenta procedura de iluminare, apoi legăturile cu utilizatorul. Aceste doua capitole conțin atât detalii de realizare fizică dar și de implementare a programului și mail-urile către utilizator. Capitolul cinci va prezenta monitorizarea temperaturii și a umidității relative, vizualizarea în timp real a plantelor dar și urmărirea creșterii plantelor. Capitolul șase va fi reprezentat de asamblarea serei și de detaliile de proiectare ale acesteia.
La sfârșitul lucrării vor fi atașate codurile Python realizate și încărcate pe Raspberry Pi, cu mențiunea ca parola de email a fost înlocuită cu aliasul „PAROLA” din motive de siguranță a contului de email creat de mine.
Anexa A va cuprinde codurile cu mențiuni și explicați, în Anexa B se vor găsi măsurători executate pe 3 tipuri de plante cu caracteristici diferite și observarea eficientei algoritmului de măsurare. Anexa C cuprinde exemple de recunoaștere pentru 2 tipuri de plante. Anexa D este dedicată împărțirii timpului alocat proiectului și va conține diagrama Gantt.
Capitolul 1 – Prezentarea componentelor hardware utilizate
În acest capitol vor fi prezentate componentele hardware utilizate pentru realizarea acestui proiect, modul lor de funcționare, rolul în cadrul acestui sistem și motivarea alegerii lor pe baza specificațiilor și caracteristicilor de construcție ale acestora.
Componentele hardware vor fi descrise din punct de vedere al funcționalității, al principiului de bază și cum influențează contextul folosirii lor în proiect. Va fi descrisa abordarea utilizată și justificată alegerea fiecărei componente hardware care a intrat în realizarea serei. Alegerea componentelor hardware s-a făcut pe baza unor criterii atât de funcționalitate dar și de realizare fizică (exemplu: dimensiunea redusa a unor componente sau prezența găurilor pentru montarea pe suprafețe plate).
1.1 Raspberry Pi 3B+
Acest proiect se bazează pe Raspberry Pi care este un SBC (Single Board Computer) foarte versatil și care poate fi folosită în foarte multe tipuri de aplicații, întrecând un microcontroler ca varietate de utilizare.
SBC-ul este una dintre cele mai populare alegeri în proiecte de tip „embedded” dar și din noul domeniu „IoT”. Prețul acestuia este unul mic pentru puterea acestuia de procesare și funcțiile variate pe care le poate îndeplini în cadrul unui sistem.
Asemănarea lui cu un „calculator” clasic îl face o alegere sigura în proiecte de diverse tipuri și complexități. Interfața lui este accesibilă iar programarea este intuitivă. Suportul celor de la Raspberry Pi și dezvoltarea continuă a comunității aduce noi posibilități în materie de proiecte, programe și aplicații pentru domenii bine cunoscute.
Raspberry Pi 3B+ este modelul folosită pentru acest proiect și reprezintă a treia generație de Raspberry Pi și este un mini-calculator realizat pe o singura placa, ce poate fi folosită într-o gama largă de aplicații.
Acesta are un CPU pe 64 de biți de tip Quad Core 1.2GHz Broadcom BCM2837, memorie RAM de 1GB, un port Ethernet, patru porturi USB 2.0 folosite pentru conectarea perifericelor, un port HDMI, un port CSI pentru conectarea camerei. Sistemul de operare se va afla stocat pe un card MicroSD, care se va introduce în slot-ul dedicat de pe Raspberry Pi. SBC-ul va fi alimentat la 2,5A folosind un cablu dedicat.
Figura 1-1
Pe Raspberry Pi va rula sistemul de operare Raspbian în varianta Desktop, descărcat și instalat de pe site-ul oficial al dezvoltatorilor Raspberry Pi. Am ales utilizarea variantei Desktop deoarece voi utiliza mediul de dezvoltare Geany, pus gratuit la dispoziția utilizatorilor de Raspbian. Acesta a facilitat editarea codului sursă utilizat pentru funcționarea serei. Această variantă de sistem de operare permite și accesarea terminalului și scrierea comenzilor ca pe orice
versiune de Linux. Terminalul va fi intens folosită pentru descărcarea librăriilor, aducerea sistemului de operare la ultima versiune, rularea codului și testarea funcționalităților [1].
În cadrul serei realizate Raspberry Pi are rolul de microcontroler pentru partea de menținere a condițiilor pentru plante și de server video, pentru monitorizarea video și urmărirea procesului de creștere în înălțime.
Am ales Raspberry Pi 3B+ în loc de alt microcontroler deoarece partea de monitorizare video și prelucrare video se pot extinde mai mult cu acest dispozitiv.
Pe placa exista 40 de pini de tip GPIO, fiind pini digitali, care pot fi folosiți ca intrare sau ieșire. Pinii au nume asociate ce nu respecta ordinea în care ei sunt dispuși fizic. Denumirile și funcțiile lor de baza se pot vizualiza în Figura 1-1, împreună cu așezarea lor fizică. Intre aceștia se găsesc 2 pini de tensiune 5V, 2 pini de tensiune 3,3V și 8 pini de tensiune 0V. Acești pini nu sunt configurabili având doar tensiunile de ieșire stabilite, însă ceilalți pini suporta tensiuni de intrare și ieșire de până la 3,3V. Configurarea pinilor se realizează după cum urmează. Dacă un pin este configurat ca ieșire acesta poate avea două nivele de tensiune : nivel înalt și nivel scăzut (engleză: „high” și „low”) semnificând 3,3V și respectiv 0V, iar dacă acesta este setat ca intrare el va fi citit tot după aceste doua nivele de tensiune (3,3V și 0V). Pinii mai pot avea diferite funcții, diferite de cele menționate mai sus, unele putând fi folosite pe oricare dintre pini, altele doar pe pini specifici. Printre aceste funcții regăsim funcția PWM , utilizată și în acest proiect pentru controlul pompei de curent continuu. Exista doua tipuri de PWM disponibil cu ajutorul pinilor de pe placa. Primul tip este PWM realizat de hardware și poate fi folosită numai pe pinii dedicați GPIO12, GPIO13, GPIO18, GPIO19. Al doilea tip de PWM este realizat de software și poate fi folosită pe toți pinii.
Deși sunt numeroși, pinii de tip GPIO prezenți pe Raspberry Pi nu suporta mai mult de 16mA fiecare și 51mA în total. Aceste limitări au fost luate în considerare în acest proiect pentru protejarea SBC-ului dar și a componentelor utilizate.
Programarea pinilor de tip GPIO se poate face folosind mai multe limbaje de programare cum ar fi C, C++, Python, Scratch. În acest proiect programarea pinilor s-a realizat în Python, utilizând librăria RPi.GPIO. Aceasta librărie permite folosirea pinilor ca intrări sau ieșiri și facilitează citirea de la aceștia [2].
1.2 Senzorul de umiditate rezistiv
Direct în sol va fi montat un senzor de umiditate de tip rezistiv care este folosită într-o gama largă de aplicații cum ar fi mici proiecte de agricultură sau creșterea plantelor în apartament. Acesta reprezintă o metoda convenabilă, ușor de folosită și care nu reprezintă niciun risc pentru plantă, neafectând-o în mod direct. Alegerea acestui senzor a fost făcută pe baza modului de funcționare, a dimensiunilor sale reduse și a prețului accesibil. Fiind un senzor cu ieșire atât digitala cât și analogica, conectarea la Raspberry Pi a putut fi făcută folosind ieșirea digitala fără a fi nevoie de folosire unui convertor analog-digital. Scopul lui în acest proiect este de a oferi date de intrare în Raspberry Pi cu ajutorul cărora se va controla udarea plantelor.
Figura 1-2
Senzorul are doua probe care introduse în sol vor măsura rezistența în funcție de cantitatea de apa din sol. Solul uscat va avea o conductivitate mai scăzută decât solul umed, iar schimbările vor fi resimțite la măsurarea rezistenței. Alimentarea acestui senzor s-a făcut la 5V, așa cum este recomandat [3].
1.3 Pompa de curent continuu
Pompa comandată pentru udarea plantelor este o pompa de curent continuu care va fi introdusă intru-un bazin cu apă și va avea un furtun conectat, al cărui capăt va fi introdus în ghiveciul plantei. Acest model de pompă este unul ce se introduce vertical în bazin și va scoate apa la comandă atunci când este nevoie. Carcasa acesteia și modul de construire este unul amfibiu ce permite scufundarea totală în apă.
Figura 1-3
Alegerea modelului a fost făcută pe baza specificațiilor, a dimensiunilor reduse (înălțime de 4.26 cm și lățime maximă de 3,85 cm ) și datorită faptului ca este o pompa silențioasa. Pompa are o tensiune maximă de alimentare de 4,5V, curentul maxim fiind de 0,18 A , având capacitatea de pompare este de până la 100L/h [4]
1.4 Driver-ul de motor dual în punte H
Bazat pe cipul MX1508 ,driver-ul poate controla maxim două motoare de curent continuu sau un singur motor de tip stepper. Intrările pentru comandă sunt A1, A2 pentru motorul 1, respectiv B1 și B2 pentru motorul 2. Prin combinații ale semnalelor de intrare se pot obține cele doua sensuri de funcționare ale motoarelor (înainte și înapoi), frână sau așteptare. Există și posibilitatea de a controla viteza motorului printr-un semnal PWM.
În cadrul acestei sere el va controla doar un singur motor de curent continuu iar scopul lui principal este protejarea plăcii Raspberry Pi.
Alimentarea acestui driver se poate face intre 2V și 10V, intrările suportă tensiuni intre 1,8V și 7V iar curentul de lucru este de până la 1,5A.
Alegerea acestui driver s-a făcut pe baza dimensiunilor sale reduse, durabilității, protecției pentru motor și datorită faptului ca are un consum mic de energie [5].
Figura 1-4
1.5 Senzorul de temperatura și umiditate DHT11
Pentru înregistrarea temperaturii și a umidității din seră am utilizat senzorul de temperatură și umiditate DHT11. Acesta este un senzor care poate citi continuu temperatura și umiditatea pe care le va transmite la microcontroler pentru a fi vizualizate de utilizator.
Figura 1-5
Acest senzor măsoară temperatura aerului intre 0 °C și 50 °C cu o acuratețe de ±2.0°C și umiditatea aerului intre 20% și 90% RH (umiditate relativă) cu o acuratețe de ±5.0% RH. Are un consum mic de putere și este un senzor stabil pe termen lung. Acesta a fost ales pe baza performanțelor foarte bune în aplicații ce nu necesita condiții extreme, cum ar fi sera de apartament. Dimensiunile reduse și posibilitatea de montare pe suprafețe reprezintă un alt avantaj al folosirii acestui senzor în cadrul acestui proiect [5].
1.6 Fotorezistorul
Pentru monitorizarea cantității de lumină pe care o primesc plantele vom folosi un fotorezistor care va indica prezenta sau absenta luminii. Fotorezistorul este o componentă pasivă care are un principiu de funcționare foarte simplu, o precizie buna și este ușor de folosită. Rezistenta acestuia variază în funcție de lumina căzuta pe suprafața lui sensibila și scade cu cât lumina este mai puternică. În aceasta aplicație ieșirea fotorezistorului va fi criteriul de comutație pentru bara de LED-uri ce va asigura lumina plantelor și va avea doua stări specificate : „Lumina” și „Întuneric” [6].
1.7 Raspberry Pi Camera V2
Figura 1-6
Modulul de camera este special conceput pentru Raspberry Pi și este folosită în foarte multe aplicații ce necesita înregistrare video sau captare de imagini. Aplicațiile pot fi dezvoltate în foarte multe feluri, fiind foarte ușor de lucrat cu aceasta camera inteligenta.
Camera folosită în acest proiect reprezintă versiunea numărul 2 (V2) a camerei originale pentru Raspberry Pi. Ea este bazată pe un senzor Sony IMX219 de 8Mp și poate fi folosită pentru înregistrare video de calitate înaltă sau fotografii. Librăriile puse la dispoziție pentru această cameră sunt diverse și pot fi folosite în foarte multe tipuri de aplicații ce necesita camera.
Sunt suportate modurile 1080p30, 720p60 și VGA90 pentru înregistrare video și performează bine și în condiții de luminozitate mai scăzută. Se conectează la Raspberry Pi printr-un cablu de tip „ribbon” care este foarte flexibil și permite mutarea camerei și poziționarea ei după necesitate. Cablul este conectat la portul CSI pe Raspberry Pi.
Manevrarea camerei trebuie făcută cu grija deoarece aceasta este sensibila la electricitatea statica. Ea trebuie conectată numai când Raspberry Pi este nealimentat pentru a evita accidentele, precum atingerea camerei de pinii GPIO și distrugerea completa a senzorului [7].
Capitolul 2 –Tehnologii software utilizate
2.1 Sistemul de operare Raspbian
Pentru accesarea Raspberry Pi și folosirea acestuia ca centrul serei inteligente este necesară instalarea sistemului de operare Raspbian, disponibil gratuit pe site-ul oficial al producătorului.
Raspbian este un sistem de operare complet gratuit bazat pe Debian, optimizat pentru funcționarea pe Raspberry Pi și este sistemul de operare recomandat pentru acest dispozitiv. Acest software vine cu peste 35000 de pachete, software pre-compilat și adunat într-un format atrăgător, accesibil, ușor de instalat și folosită. Raspbian este un proiect al comunității active aflat sub îmbunătățire și modificare continuă, într-un efort de a aduce utilizatorilor un produs final complet [8].
Instalarea Raspbian este una simplă și ghidată pentru a avea acces la toate resursele puse la dispoziție de acest sistem de operare. De pe site-ul oficial Raspberry Pi se descarcă arhiva conținând varianta de Raspbian aleasă. Aceasta poate fi Desktop sau Lite. Varianta Desktop oferă mai multe opțiuni și accesare mai facila, în timp ce varianta Lite este axata pe terminal, fiind un bun mijloc de învățare. Deși în aceasta lucrare se va folosi varianta Desktop, majoritatea comenzilor vor fi prin intermediul terminalului pentru o mai buna înțelegere a comenzilor și a utilizărilor acestora.
După descărcarea arhivei aceasta se copiază pe un card de tip MicroSD și se dezarhivează conținutul direct pe cardul de memorie. Cardul se va introduce în Raspberry Pi atunci când acesta nu este alimentat. Se introduc pe rând toate dispozitivele periferice ce se doresc a fi utilizate: monitor, mouse, tastatură. Se pornește alimentarea și se așteaptă ca instalarea sistemului de operare sa se facă automat, fără intervenția utilizatorului. Timpul este accesibil, iar placa poate fi utilizată imediat după.
Atunci când sistemul de operare și-a completat instalarea, utilizatorul este rugat sa facă prima autentificare, care are loc folosind numele de utilizator și parola implicite. Acestea sunt găsite tot pe site-ul oficial Raspberry Pi și pot fi modificate de cate ori și în ce fel dorește utilizatorul.
Prima autentificare are loc astfel:
Username: pi
Password: raspberry
După prima autentificare utilizatorul poate folosi toate programele pre-instalate și toate funcționalitățile acestui sistem de operare [9].
Înainte de începerea propriu-zisa a realizării programelor folosind editorul Geany, vom actualiza sistemul de operare și pachetele cât de des este posibil, pentru a fi mereu la curent cu ultima versiune și ultimele modificări. Pentru acest pas Raspberry Pi va trebui conectat la internet, fie folosind un cablu de Ethernet fie folosind conexiunea wireless la o rețea din apropiere.
Deoarece folosim varianta Desktop a sistemului de operare Raspbian se va găsi și folosi LXTerminal. Toate comenzile vor fi introduse manual în acesta.
Pentru a ne asigura ca Raspberry Pi are pe el ultima versiune de pachete disponibile vom folosi următoarele comenzi:
sudo apt-get update
sudo apt-get upgrade
sudo reboot
Prima comanda va actualiza index-urile pachetelor, a doua comanda va face actualizarea propriu-zisa în timp ce a treia comanda este pentru restartarea plăcii. Comanda „apt” este folosită sa instaleze software pe sistemul de operare Raspbian. După ce Raspberry Pi pornește din nou, utilizatorul își poate folosi în continuare toate resursele, fiind sigur ca toate pachetele sunt la ultima versiune.
Folosirea „sudo” da acces utilizatorului sa facă schimbări permanente având privilegiul de „root”. Aceasta comanda da temporar acest acces pe contul utilizatorului sa facă aceste schimbări. Comenzile precedate de „sudo” trebuie date cu foarte mare atenție, deoarece folosirea greșită poate atrage consecințe grave și face schimbări ireparabile la nivelul sistemului de operare [10].
După realizarea de scripturi folosind un mediu de dezvoltare (ex: Geany) sau chiar direct terminalul și salvarea acestora, ele se vor rula folosind următoarele comenzi. În acest proiect codul va fi scris integral folosind limbajul de programare Python și toate comenzile sunt adaptate pentru acest mod de utilizare. Pentru fișierele salvate în directorul principal se va proceda astfel:
ls
Directoarele și fișiere aflate aici vor fi listate.
python nume_fisier.py
După aceasta comanda script-ul de Python va rula și utilizatorul va putea observa rezultatele direct în consola apărută și sesiza diferite erori.
2.2 Limbajul de programare Python
Pentru realizarea codului acestui proiect se va folosi integral limbajul de programare Python. Acesta este un limbaj foarte popular, conform statisticilor recente și deși este apărut de aproximativ 30 de ani rămâne încă unul dintre limbajele de programare care domină piața. Gama largă de utilizare a acestui limbaj accesibil nu se limitează doar la aplicații web, iar el poate fi folosită în aplicații de tip „embedded”. În cadrul acestui proiect se utilizează limbajul de programare Python într-o aplicație de tip „embedded”. Folosirea acestuia are numeroase avantaje printre care și rularea codului realizat în Python pe orice sistem de operare. În acest caz este necesară rularea pe Raspbian, care este o distribuție de Linux modificata.
Limbajul Python se remarca prin conceptul sau de bază, adică indentarea. Indentarea reprezintă aranjarea codului după un anumit set de reguli astfel încât acesta sa fie interpretat de compilator. Avantajul acestei metode de scriere este ca duce la scăderea numărului de linii de cod dintr-o aplicație complexă. În același timp, aceasta metoda prezintă și un mare dezavantaj. Acela de a avea linii de cod indentate după alte reguli, când acestea trebuia interpretate în mod diferit. Corectitudinea și eficienta codului depind în întregime de programator și de atenția acordata indentării.
Un alt avantaj al acestui limbaj de programare este reprezentat de numărul mare de biblioteci și diversitatea acestora. Fiecare membru al unei comunități bazate pe o resursa de tip „open-source” (fără licență comerciala) poate contribui la dezvoltarea de noi soluții, creând astfel noi oportunități pentru diverse game de aplicații. În acest proiect librăriile Python utilizate vor fi descrise în capitolele aferente folosirii lor.[11] [12].
Pentru instalarea Python 3 pe Raspberry Pi se folosește următoarea comanda dată în terminal [13]:
sudo apt-get install python3 pip
2.3 Librăria OpenCV
OpenCV, (pe scurt de la Open Source Computer Vision Library) reprezintă o librărie de tip „open source” folosită în foarte multe aplicații de inteligență artificială, recunoaștere și analiză de conținut. Scopul acestei librarii este de a accelera procesul de percepție și a aduce aplicații complexe în toate domeniile ce necesita acest tip de librărie.
Utilizată pe scara largă chiar și de marii dezvoltatori de aplicații precum Google sau Microsoft. OpenCV a contribuit la îmbunătățirea acestui sector de aplicații și are o comunitate de contribuitori destul de mare.
Librăria OpenCV este gratuită și poate fi utilizată în scopuri academice dar și comerciale, făcând astfel mai ușoare dezvoltarea și inovarea. Conținând peste 2500 de algoritmi diverși, aceasta librărie se poate folosi la aplicații precum recunoașterea facială, detectarea mișcării, detectarea obiectelor, urmărirea obiectelor dar și prelucrarea imaginilor pentru o calitate mai buna sau reproducerea modelelor 3D.
OpenCV are interfețe pentru Python, C++, Java și MATLAB și poate fi folosită pe Windows, Linux, Android și Mac OS și aplicațiile pe care se axează sunt cele de video în timp real.
În acest proiect librăria va fi folosită pentru recunoașterea conturului plantei, recunoaștere ce va fi mai încolo folosită pentru măsurare. Folosirea librăriei a fost aleasă în acest proiect datorită popularității ei si datorită faptului ca este foarte versatilă [14].
2.4 Conectarea la internet, configurarea pentru Gmail și securitatea
Raspberry Pi va fi conectat în permanenta la o rețea wireless, deci conexiunea fizică prin Ethernet nu este necesară, ba chiar ar aglomera incinta limitata ca spațiu a serei. Conectarea la rețeaua wireless se realizează ca pe orice alt dispozitiv prin alegerea rețelei și introducerea parolei.
Pentru a putea trimite și primi mail-uri vom utiliza serviciul Gmail, pus gratuit la dispoziție utilizatorilor de către Google. Utilizatorii pot accesa Gmail pe orice platforma și pe orice sistem de operare chiar și din alte aplicații de mail, nu neapărat cea de la Google. În octombrie 2018 serviciul avea peste 1,5 miliarde de utilizatori și este printre cele mai populare servicii de mail [15].
În aceasta aplicație folosirea Gmail pe toate dispozitivele reprezintă un avantaj deoarece utilizatorul poate verifica notificările atât de telefon cât și pe orice alt dispozitiv, fără a exista limitări și fără a fi necesară instalarea altor aplicații.
Se va crea o adresă de email dedicată de pe care vom trimite mail în contul utilizatorului sau orice cont necesar. În acest proiect s-a ales trimiterea mail-urilor tot către contul dedicat, deoarece am efectuat multe teste, iar multe mail-uri ar fi aglomerat căsuța unui mail utilizat în mod curent. După faza de testare se va trece la un mail des utilizat pentru ca notificările vor fi destul de rare și în număr mic, atât cât este necesar pentru transmiterea datelor esențiale.
Crearea contului se face în mod normal urmând pașii recomandați de Google, cei de verificare a identității și cei de securitate.
Figura 2-1
Deși contul este gata de a fi folosit, este nevoie de accesarea setărilor de securitate din cont. Modul de trimitere a mail-urilor din acest proiect este văzut de serviciul Gmail ca fiind de securitate scăzută și trebuie sa permitem și conectarea acestui cont prin aplicații de securitate mai joasa.
2.5 SMTP
Pentru transmiterea mail-urilor de notificare către utilizator este necesară utilizarea unui protocol de mail. În continuare este prezentat protocolul utilizat și particularitățile acestuia.
SMTP (Simple Mail Transfer Protocol) reprezintă protocolul standard pentru servicii de tip mail.
Este un protocol întâlnit la nivelul Aplicație al stivei TCP/IP și asigura transmisia și livrarea unui email prin intermediul Internetului. Acest protocol se întâlnește în aplicații de mail care au ca și componente patru elemente cheie: clientul (utilizatorul), server-ul, agentul de transfer și agentul de livrare.
Utilizarea acestui protocol pe Raspberry Pi se poate face direct din terminal, însă aceasta metoda nu este potrivita pentru aceasta aplicație, de aceea trimiterea mail-ului va fi integrata în codul aplicației.
Se va folosi librăria Python „smtplib” pentru instrucțiunile specifice iar pe Raspberry Pi se va instala serviciul SMTP folosind:
sudo apt-get install ssmtp
După instalarea serviciului se va folosi:
sudo apt/etc/ssmtp/ssmtp.conf
Această comandă accesează setările. Aici vom introduce toate datele aferente contului creat special pentru acest proiect.
Figura 2-2
După introducerea datelor vom folosi comanda următoare pentru a testa toate funcționalitățile:
echo “hello” | mail -s “test” rasp.pi.929@gmail.com
După ce aceasta comandă a fost dată se va accesa contul de Gmail creat pentru a verifica dacă mail-ul de test a ajuns la destinație.
Figura 2-3
Serviciul SMTP a fost corect instalat pe Raspberry Pi și mail-urile se trimis corespunzător. După aceasta etapa vom putea integra și folosi serviciul SMTP în codul aplicației care va fi adaptat pentru a corespunde cerințelor aplicației.
Capitolul 3 – Udarea plantelor
3.1 Observarea factorilor de mediu
Primul și cel mai important aspect din întreținerea condițiilor plantei este udarea acestora. Multe plante de apartament se recomanda a fi udate cel puțin o dată pe săptămâna pentru a fi sănătoase și a se putea dezvolta. Planta folosită și studiată în acest proiect este o plantă de Yacon, care nu este o plantă de apartament, aceasta are nevoie de condiții diferite. Înainte de începerea realizării proiectului am ținut planta sub observație pentru a vedea cât de des este necesară udarea. În condițiile de apartament, solul devenea foarte uscat odată la trei zile, iar planta începea sa dea semne ca nu are suficientă apă, frunzele erau lăsate în jos din cauza lipsei de umiditate a solului. Senzorul de umiditate din pământ semnala lipsa de umiditate tot la un interval de trei zile. S-a realizat o calibrare a acestuia pentru a nu fi depășit acest termen de 3 zile.
Tabel 3-1
Figura 3-1
3.2 Schema electrică și conectarea la Raspberry Pi
Montajul realizat fizic pentru procedura de udare a plantelor este prezentată în acest subcapitol și se regăsește în schema din figura 3-2.
Udarea plantelor se va face cu ajutorul pompei prezentate în subcapitolul 1.3. Pompa submersibila va fi pusă într-un recipient cu apă, ușor de reumplut de către utilizator, și suficient de mare pentru a întreține umiditatea solului pentru o perioadă de timp mai mare. În acest caz, utilizatorul poate sa nu fie prezent pentru un timp îndelungat (de exemplu: este într-o călătorie) iar plantele vor fi udate la intervalul necesar dezvoltării lor. Un furtun va fi atașat și securizat de ghiveciul plantei astfel încât sa nu își schimbe poziția din cauza apei date de pompa. Dacă furtunul se mișcă în timpul udării este posibil ca apa să ajungă pe Raspberry Pi sau pe modulele din seră. Eveniment ce nu este dorit sub niciun fel, iar evitarea acestuia și siguranța plăcii și a modulelor sunt esențiale pentru buna funcționare a serei.
Figura 3-2
Conform datelor de la producător, pompa de curent continuu poate avea un curent maxim de 180mA, care este mult peste limita de 16mA per pin pentru conectarea de componente la Raspberry Pi. Pentru protejarea plăcii și acționarea corecta a pompei de curent continuu se va folosi driver-ul de motor prezentat în subcapitolul 1.4. Controlul pompei și modurile de acționare vor fi descrise în subcapitolul 3.3. Driverul va fi alimentat la o sursa te tensiune continua de 5V pentru a reduce consumul total de energie de la Raspberry Pi. Una dintre caracteristicile de baza ale acestui driver de motor este ca în timpul de „standby” (așteptare), el consuma curenți extrem de mici, de ordinul micro amperilor.
Conectarea acestuia la Raspberry Pi se va face legând cele 2 intrări, marcate IN1 și IN2 la GPIO 7 respectiv GPIO 27, în timp ce ieșirile OUT1 și OUT2 vor fi conectate la alimentarea respectiv firul de nul al pompei. GPIO 7 va fi setat ca PWM de tip software pentru a limita astfel viteza pompei.
Acționarea pompei se va face pe baza semnalului digital primit de la senzorul de umiditate introdus în sol. Acesta este montat lângă planta, cât mai aproape de rădăcina, așa cum este indicat. Ieșirea digitală a acestuia va fi conectată la GPIO 21 de pe Raspberry Pi și va fi citit la interval de o secunda. Conform datelor de producător senzorul va consuma maxim 15mA, valoare ce nu pune în pericol placa sau senzorul. Dacă apa este prezentă în sol, rezistența va scădea deoarece solul umed va conduce curentul mai bine decât solul uscat, iar senzorul va semnala imediat acest aspect. Raspberry Pi va răspunde cu comanda pentru driver și pompa va fi acționată. După ce apa furnizată de pompă a ajuns în ghiveci senzorul de umiditate va simți prezenta apei, va transmite semnalul către Raspberry Pi iar acesta va da comanda de oprire a pompei.
3.3 Implementarea soluției
Luând în calcul evoluția umidității solului pe perioada observata, soluția software va răspunde întocmai cerințelor. Verificarea senzorului de umiditate a solului va fi făcută în mod continuu la o secunda. În program se va introduce un numărător, care va numără secundele fiecărei acționari a pompei. Dacă solul este uscat acest numărător va fi incrementat odată la o secundă atâta timp cât este acționată pompa. Când numărătorul ajunge la 2 secunde se va iniția procedura de transmitere a mai-lului către utilizator.
Programul este bazat pe organigrama prezentată în figura 3-3 și va fi atașat în Anexa A a acestei lucrări.
Figura 3-3
Se vor folosi următoarele librarii Python :RPi.GPIO, time, smtplib. RPi.GPIO face legătura dintre cod și pinii fizici existenți pe Raspberry Pi și face posibilă codarea și utilizarea acestora. Librăria „time” va fi utilizată pentru funcția „sleep”. Aceasta funcție va determina timpul intre citirile succesive de la senzorul de umiditate. Librăria „smtplib” va fi folosită pentru funcțiile de trimitere mail și configurări.
Se folosește comanda :
GPIO.setwarnings(False)
Aceasta dezactivează mesajele de tip „warning” care pot apărea datorită pinilor folosiți în alte programe și rămași setați într-un anumit mod.
Pentru accesarea pinilor și configurarea lor s-a ales modul BCM, dat prin comanda:
GPIO.setmode(GPIO.BCM)
Se vor folosi denumirile pinilor pentru accesare, nu numărul care este atribuit fiecărui pin. Accesarea folosind numărul se va face folosind comanda modificata cu „BOARD” [17].
Programul începe cu configurarea pinilor de intrare și ieșire folosind sintaxa:
GPIO.setup(numar_GPIO,stare)
Starea poate fi de forma GPIO.OUT sau GPIO.IN pentru ieșiri respectiv intrări digitale. Conform conectării fizice GPIO 21 va fi configurat ca intrare iar GPIO 27 și GPIO 07 vor fi configurate ca ieșiri.
Urmează configurarea GPIO7 ca PWM software cu frecventa setată în linia de cod de mai jos, care rămâne nemodificata. Frecventa de start va fi 100Hz, pentru testare.
pwm=GPIO.PWM (07,100)
pwm. start (0)
Pe GPIO 7 se va porni PWM-ul din momentul 0 si vom verifica funcționalitatea pompei folosind următoarele comenzi. La pornirea programului pentru timp de o secunda vom verifica funcționalitatea pompei. Testul acesta s-a efectuat fără submersia pompei în apa. GPIO7 si GPIO27 vor fi inițializați cu valorile inițiale TRUE si respectiv TRUE, pentru a fi folosite conform tabelului 3-2.
GPIO.output(07, True)
GPIO.output(27, True)
Pompa ar trebui sa răspundă timp de o secunda, pentru a vedea ca nu este nimic în neregula cu ea.
După efectuarea testării se vor face configurările pentru transmiterea email-ului. Se va inițializa serverul si se va autentifica mail-ul creat special pentru notificări. Se va crea tipul de mesaj si va avea forma dorita de SUBIECT si TEXT.
server=smtplib. SMTP('smtp.gmail.com',587)
server. starttls ()
server. login("rasp.pi.929@gmail.com",”PAROLA")
SUBIECT="Notificari sera"
TEXT="Planta a fost udata."
msg='Subject: {} \n\n {}'.format(SUBIECT,TEXT)
Se va inițializa numărătorul la valoarea 0, acesta va fi folosită pentru a număra secundele în care pompa este activă si plantele sunt udate.
După toate aceste inițializări si configurări vom crea o bucla infinita care va citi ieșirea senzorului de umiditate
S-a luat în considerare viteza pompei și controlul ei astfel încât cantitatea de apă sa fie limitată. Controlul pompei s-a făcut luând în considerare următoarele combinații ale semnalelor de pe GPIO07 și GPIO27 [18].
Tabel 3-2
Din acest tabel vom folosi doar stările „Înainte” și „Oprire”. La acest model de pompa acționarea inversă („Înapoi”) nu este posibilă și în aceasta aplicație ea nu ar fi fost relevantă.
Când senzorul de umiditate va raporta un sol uscat, se va schimba factorul de umplere al pwm-ului la 50% iar GPIO07 și GPIO27 vor avea valorile TRUE respectiv FALSE.
pwm.ChangeDutyCycle(50)
Numărătorul “num” va contoriza secundele pentru care exista semnal pe GPIO21. Când numărătorul a ajuns la 2 secunde, se va folosire următoarea comanda pentru a trimite mail-ul creat si configurat mai sus.
server.sendmail("rasp.pi.929@gmail.com","DESTINATAR",msg)
Problema întâmpinată la aceasta etapă a fost trimiterea prea multor mail-uri atât timp cât pompa era activă și uda plantele. Trimiterea unui mail în momentul exact al acționarii pompei conducea la trimiterea a mai multor mail-uri consecutive care inundau căsuța poștală a utilizatorului. Acest aspect neplăcut a fost rezolvat cu implementarea numărătorului și trimiterea mail-ului doar la după 2 secunde după începerea udării plantelor.
Figura 3-4
După fiecare citire realizată în bucla de „while” programul va aștepta o secundă până la următoarea citire. Din librăria time se va folosi funcția sleep care va opri activitățile timp de o secundă. Structura comenzii este următoarea:
time.sleep(1)
În cazul în care planta a fost deja udata sau solul nu este încă uscat, numărătorul va fi resetat la valoarea inițiala de 0 iar programul va verifica din nou peste o secunda. Pentru a evita eventualele probleme apărute cu oprirea pompei după ce aceasta a fost acționată ea va fi forțata sa se oprească. GPIO7 și GPIO27 vor avea ambii valoarea TRUE, forțând motorul sa frâneze. Fără aceasta comanda asupra motorului programul nu a funcționat corespunzător. PWM-ul va fi de asemenea oprit deoarece în acest caz folosirea lui nu este necesară. Se va folosi [19] următoarea comanda :
pwm.stop()
La sfârșitul programului vom închide server-ul de mail și vom efectua o „curățare” asupra pinilor, dacă aceștia nu vor mai fi folosiți și pentru a nu fi ținuți ocupați de alte programe, care pot cere acces la aceleași resurse:
server.quit()
GPIO.cleanup()
3.4 Concluzii generale după implementare
După implementarea algoritmului si realizarea soluției fizice se constată că intervalul de aproximativ de 3 zile se respectă si la udarea plantelor folosind pompa de curent continuu. Planta este udată corespunzător și nu prezintă semne de lipsa de apă.
Senzorul de umiditate a solului de tip rezistiv are avantaje în cadrul acestui proiect însă folosirea lui intensa și aflarea acestuia în sol pe perioade îndelungate poate duce la funcționarea defectuoasă sau la scăderea preciziei.
Folosind senzorul de umiditate rezistiv planta nu este pusă în pericol deoarece acest senzor nu conține substanțe care ar putea dauna dezvoltării plantei. Folosirea acestuia pe timp îndelungat are următoarele dezavantaje majore. În continuare se vor explica aceste dezavantaje și se vor oferi soluții de remediere de lungă durată.
Folosirea senzorului de umiditate rezistiv pe o perioada lungă de timp va duce la deteriorarea probelor inserate în sol. Stratul de metal de pe acestea va începe să se subțieze și să dispară pe porțiuni. Acest fenomen se întâmplă deoarece proprietățile solului și apa folosită la udare duc la corodarea senzorului și la scăderea performantelor acestuia.
Remedierea acestei probleme este reprezentată de înlocuirea senzorului când acesta își pierde complet proprietățile iar stratul de metal prezent pe probe este afectat iremediabil. Scăderea preciziei nu reprezintă o problema imediata în folosirea acestui senzor deoarece în acest tip de aplicație precizia acestuia nu este necesară; se dorește doar detectarea apei în cantități mai mari.
Dacă senzorul își va pierde proprietățile total și stratul de metal prezent pe probe va fi vizibil afectat, înlocuirea acestuia se poate face ușor și fără alte complicații. Cele doua fire care leagă senzorul de modulul ieșire vor fi deconectate de la senzorul afectat și cel nou va fi atașat și inserat în sol.
În concluzie acest inconvenient nu este unul care ar reprezenta un pericol real și imediat însă la utilizarea de lungă durata a serei se vor constata probleme cu acesta iar înlocuirea este necesară.
Capitolul 4 – Iluminarea plantelor
4.1 Observarea factorilor de mediu
Pentru observarea factorilor de mediu s-a realizat testarea folosind fotorezistorul conectată la Raspberry Pi pentru a vedea cam în jurul cărei ore semnalul dat către SBC va fi „1”.
Am urmărit semnalul de la fotorezistor timp de 2 săptămâni, doar la lumina naturala. Conform testului fotorezistorul sesiza o descreștere a luminii în jur de ora 19:00, când intensitatea luminii scădea considerabil.
Ținând cont de acest aspect procedura de notificare a utilizatorului nu putea fi corelata cu cea pentru udarea plantelor, deoarece cel puțin o notificare pe zi va fi de la lumina, iar cele de la acționarea pompei pentru udarea plantei ar fi mult mai rare.
În concluzie dacă nu intervin alți factori ( lumina de la un bec din încăpere sau alte surse de lumina) bara de LED-uri va fi aprinsă o dată pe zi și se va trimite un singur mail de notificare.
4.2 Schema electrică și conectarea la Raspberry Pi
Montajul fizic pentru iluminarea plantelor este realizat conform schemei din figura 4-1 și este detaliată în acest subcapitol.
Figura 4-1
Fotorezistorul va fi intrarea acestui montaj și va avea două stări „1” și „0”, în funcție de semnalul primit de la el Raspberry Pi va acționa cele doua LED-uri pentru iluminarea serei. LED-urile vor fi lipite pe o plăcuță și montate astfel încât planta sa primească cât mai multă lumină.
Pentru limitarea curentului prin fotorezistor se va folosi un rezistor de 10 KΩ legat intre alimentare de 5V provenita de la Raspberry Pi și GPIO23 pe care se va face citirea. La utilizarea LED-urilor s-au folosit rezistoare de 470 Ω pentru limitarea curentului și protejarea LED-urilor.
Ținând cont de dimensiunile de proiectare ale serei lumina provenita de la ele 2 LED-uri este suficienta și limitele de curent impuse de Raspberry Pi sunt respectate. Prin fiecare LED va trece un curent de aproximativ 7mA. Legarea celor doua LED-uri la un singur pin ar fi generat un curent destul de apropiat cu limita de 16mA per pin. Per total ansamblul nu depășește nicio specificație impusa și poate funcționa corespunzător.
4.3 Implementarea soluției
Figura 4-2
Soluția va fi implementata folosind principiul prezentat în organigrama din figura 4-2. Citirea va fi făcută în mod continuu de la fotorezistor și pe baza acestei citiri se vor lua deciziile și se va comunica utilizatorului.
În codul realizat pentru aceasta soluție ne vom baza pe datele de la fotorezistor pentru a lua decizii, astfel pinul GPIO23 va fi inițializat ca fiind intrare digitala. Pentru aprinderea celor doua LED-uri se vor utiliza pinii GPIO24 și GPIO5, declarați ca ieșiri digitale.
Mail-ul trimis va fi de forma aceasta, iar subiectul va fi identic ca cel de la udarea plantelor: „Notificări sera”. Acest subiect a fost ales special pentru a ocupa puțin spațiu deoarece un text prea lung nu ar fi încăput pe ecranele telefoanelor în aplicațiile de mail.
server=smtplib.SMTP('smtp.gmail.com',587)
server.starttls()
server.login("rasp.pi.929@gmail.com","PAROLA")
SUBJECT="Notificari sera"
TEXT="Lumina pentru crestere a fost aprinsă."
msg='Subject: {} \n\n {}'.format(SUBJECT,TEXT)
GPIO24 și GPIO7 care corespund celor două LED-uri vor avea 2 stări posibile. („High”, „Low). Citirea de la fotorezistor se va face într-o bucla infinita, iar în cazul unei lumini scăzute detectate se vor seta cele două ieșiri ca fiind „High”. În caz contrar la o lumina buna, ce este propice dezvoltării și creșterii plantei, cele două ieșiri vor fi setate pe „Low”.
În realizarea acestei soluții am întâlnit aceeași problemă a mail-urilor multiple transmise către utilizator, pentru fiecare secundă în care lumina este aprinsă. În cazul în care iluminarea ar rămâne peste întreaga noapte, utilizatorul ar vedea un număr mare de email-uri în căsuța sa. Acest aspect nedorit a fost rezolvat folosind metoda numărătorului prezentată în subcapitolul 3.3. Un numărător denumit „num” va fi introdus în program și va număra secundele pentru care lumina este aprinsă. În cazul în care lumina se stinge, numărătorul se va reseta la valoarea inițială de 0.
Trimiterea email-ului se va face numai când „num” atinge valoarea de 2 secunde. Astfel orice tranziție bruscă este evitată și utilizatorul va fi notificat doar o singură dată atunci când LED-urile se vor aprinde.
Figura 4-3
Figura 4-3 reprezintă vizualizarea mail-ului facuta de către utilizator. Acest email este unul de notificare care va fi trimis numai când lumina a fost aprinsă pentru minim doua secunde.
Iluminarea plantelor folosind LED-uri este una dintre metodele des întâlnite în industrie și este una dintre cele mai bune metode de creștere a plantelor.
În acest proiect s-a ales iluminarea folosind LED-uri deoarece LED-urile sunt un tip de iluminat accesibil și lumina acestora nu este în niciun fel dăunătoare plantelor.
Capitolul 5 – Monitorizarea serei
În acest capitol vor fi prezentate metodele de monitorizare și cum acestea pot reduce riscul îmbolnăvirii plantelor, dacă acestea sunt expuse factorilor de mediu peste limitele acceptate.
Temperatura ambiantă joaca un rol foarte important în creșterea și dezvoltarea plantelor. Temperaturile de peste 24°C sunt prea mari pentru a fi suportate de către plantele aflate în interiorul apartamentului. Aceste temperaturi însă nu afectează plantele, dacă ele sunt poziționate într-un spațiu deschis sau în aer liber. În condițiile de exterior plantele vor putea suporta aceste temperaturi mari datorită razelor soarelui care sunt benefice creșterii și a umidității mai ridicate în spațiu deschis. O temperatură mare și o umiditate scăzută în apartament nu sunt benefice și vor determina anumite semne vizibile pe planta, ce indica factori de mediu prea duri pentru o dezvoltare așa cum se dorește. Un prim semn ar fi orientarea frunzelor în jos, din cauza umidității scăzute și a căldurii acesta este un indicator ușor de observat și remediat. Îngălbenirea frunzelor sau apariția unor pete de culoare pe frunze sau tulpină reprezintă un alt semnal de alarmă asupra factorilor de mediu. Acesta din urma este mult mai grav decât orientarea frunzelor în jos și arată că planta a fost afectată mai mult și pe o perioada mai îndelungată și remedierea nu va fi atât de ușoară [24].
Monitorizarea temperaturii și a umidității folosind senzorul DHT11 are ca scop măsurarea temperaturii la ora la care aceasta atinge un maxim și notificarea utilizatorului de existenta unui pericol pentru planta.
Monitorizarea video, prin „video streaming” oferă utilizatorului posibilitatea de a observa planta în detaliu, chiar dacă el se afla la distanta. Semnele ca planta nu are condițiile necesare sau că s-a întâmplat ceva cu aceasta vor fi vizibile iar utilizatorul poate acționa cu prima ocazie.
Figura 5-1
5.1 Monitorizarea temperaturii și a umidității aerului
În acest proiect prevenirea îmbolnăvirilor și protejarea plantei se vor face folosind metodele de monitorizare prezentate în acest subcapitol și în subcapitolul 5.2.
Monitorizarea temperaturii se va face luând în calcul condițiile de apartament. Temperaturile recomandate pentru plante în interiorul apartamentului sunt în gama 15 °C – 24 °C [24]. Temperaturile mai scăzute de 15 °C nu reprezintă o problemă în acest context deoarece interiorul casei este mereu încălzit, iar o temperatură mai mică de 15 °C într-un apartament nu este un pericol real.
În acest caz vom lua în considerare doar temperaturile înalte ce pot fi dăunătoare pentru plante, cele peste 24 °C.
În interiorul serei va fi montat senzorul de umiditate și temperatura DHT11. Acesta va măsura temperatura aerului și umiditatea relativă, le va trimite către Raspberry Pi unde acestea vor fi analizate.
Senzorul și programul asociat lui nu vor lucra în permanenta, deoarece ar fi mult prea multe date care nu ar avea relevanta pentru utilizator. Trebuie luată în calcul temperatura maximă aferenta unei zile și aproximativ ora la care aceasta este înregistrată. În general ora la care se atinge temperatura maximă în decursul unei zile este atinsa intre orele 15:00 și 16:00 în fiecare zi. Se va lua în calcul acest interval și se va înregistra o măsurătoare cu senzorului la ora 15:00. Aceasta temperatura va fi reținută și transmisa utilizatorului. Dacă este peste valoarea de 24°C se va trimite un email de „Alerta” către utilizator, indicând ca temperatura în proximitatea plantei este prea ridicata și aceasta poate avea de suferit din cauza expunerii îndelungate. umiditatea relativă va fi și ea măsurată și transmisa utilizatorului.
Umiditatea relativă trebuie sa se situeze intre 50% și 60% pentru o bună dezvoltare a plantelor. Umiditatea scăzută va face resimțită temperatura mare din apartament și poate opri aproape complet procesul de creștere. O umiditate relativă mai mare de 80% este critica și poate duce la apariția bolilor de origini fungice sau dezvoltarea paraziților. [26] Aceasta va fi luată în considerare și se vor realiza alerte specifice pentru cele 4 cazuri posibile ale factorilor de mediu.
Tabel 5-1
Conform tabelului 5-1 se vor realiza patru tipuri de email-uri, trei de alertă și unul pentru notificare. Toate email-urile vor conține temperatura curentă și umiditatea relativă înregistrate la ora de vârf (15:00). Email-urile de alertă vor conține și o recomandare pentru utilizator, pentru a nu pune planta în pericol.
Se începe cu conectarea senzorului DHT11 la Raspberry Pi. Pentru protejarea acestuia și pentru protejarea SBC-ului vom folosi un rezistor de „pull-up”. Rezistorul de „pull-up” are rolul se conectează între alimentare și pinul utilizat pentru a asigura o citire de tip „High” când semnalul nu este activ.
Calculul pentru rezistorul de „ pull-up” se face pornind de la legea lui Ohm:
(5.1)
Vom adapta formula pentru calculul lui Rp:
Unde Rp este valoarea rezistorului de „pull-up”, I este valoarea curentului dorit iar Vcc este valoarea tensiunii de alimentare pentru DHT11.
Rezistorul de 10KΩ se va introduce intre pinii 1 si 2 ai senzorului. Pinul 1 reprezintă alimentarea si va fi legat la 5V pe Raspberry Pi iar pinul 2 este numit „DATA” și va fi conectat la GPIO04.
GPIO04 reprezintă intrarea care va primi date de la senzor. Pinul 3 al senzorului DHT11 nu este utilizat și acesta va fi lăsat liber. Pinul 4 este cel de „GND” și va fi conectat la un pin de „GND” de pe Raspberry Pi.
Figura 5-2
Codul va fi bazat pe organigrama din figura 5-2 și va fi detaliat în acest subcapitol. Codul va realiza o măsurătoare a temperaturii și umidității și va crea și trimite unul dintre cele patru tipuri de email prezentate în Tabelul 5-1.
Senzorul DHT11 funcționează cu o librărie suport care trebuie instalată și adusă la ultima versiune pe Raspberry Pi.
Se va utiliza următoarea comanda pentru instalarea librăriei DHT pentru Python.
sudo pip3 install Adafruit_DHT
În realizarea programului vom folosi următoarele librarii: ADAFRUIT_DHT, librăria time și librăria smtplib. Librăria ADAFRUIT_DHT reprezintă librăria dedicată care facilitează citirea de la senzorul DHT11 folosit în aceasta lucrare pentru monitorizarea temperaturii și a umidității aerului.
Înainte de începerea programului propriu zis se vor folosi configurările pentru trimiterea mail-ului și autentificarea cu contul Gmail creat pentru acest proiect. Autentificarea are rolul de a atribui SBC-ului o adresa de mail de pe care sa se conecteze și prin intermediul căreia sa trimită un e-mail către oricare alta adresa de e-mail se dorește.
Se vor declara apoi pinul folosit GPIO04 și senzorul folosit DHT11.
Se vor crea trei variabile care au rolul de indica valorile benefice de temperatura și umiditate după care s-a ghidat programul și aceasta lucrare.
DHT_SENSOR = Adafruit_DHT.DHT11
DHT_PIN= 04
t_baza = 24.00
h_mare = 60.00
h_mic = 50.00
t_baza reprezintă temperatura de 24 °C, care dacă este depășită va pune în pericol planta. h_mare și h_mic reprezintă capetele intervalului de umiditate acceptata pentru plante, respectiv 50% și 60%.
După aceste declarații se va face citirea temperaturii și a umidității relative pe GPIO16. Aceasta citire va avea loc o singura dată și datele vor fi păstrate pentru a fi comparate cu valorile menționate mai sus.
Codul urmează organigrama din figura 5-2 și realizează comparații intre parametri încadrându-i în cele patru cazuri posibile ale condițiilor de mediu. În fiecare caz detectat se va crea conținutul mail-ului adaptat la cazul respectiv folosind următoarea linie de cod.
SUBJECT="Alerta/Notificare Sera!"
TEXT="Temperatura este " + str(temperature) + " C" +"\n Umiditatea este " + str(humidity) + "%" + “ Observatii + Recomandari"
Subiectul mail-ului va fi „Alerta sera!” respectiv „Notificare sera” pentru cazurile în care temperatura și umiditatea nu sunt în gamele prezentate și respectiv pentru a-l înștiința pe utilizator că parametrii au valori normale pentru dezvoltarea plantelor.
La sfârșitul programului se va trimite un singur mail, al cărui subiect și mesaj au fost decise mai sus în urma comparării parametrilor actuali cu cei propice pentru dezvoltarea plantelor.
msg='Subject: {} \n\n {}'.format(SUBJECT,TEXT)
server.sendmail("rasp.pi.929@gmail.com","rasp.pi.929@gmail.com",msg)
Mesajul creat si subiectul vor alcătui “msg” o variabila care va retine întreg formatul și textul mail-ului. Se va trimite un mail care va aduce în atenția utilizatorului ca planta are condiții de dezvoltare normale sau aceasta trebuie mutata într-un loc mai ferit de căldura sau cu o umiditate relativă mai scăzută sau mai ridicata.
Figura 5-3
În figura 5-3 sunt prezentate cele patru tipuri de mail-uri asociate fiecărui caz prezentat în tabelul 5-1. Unul dintre aceste mail-uri va fi trimis către utilizator în fiecare zi la ora 15:00 cu condițiile de mediu.
Pentru rularea acestui script în fiecare zi la ora 15:00 se va folosi comanda:
sudo nano /etc/crontab
0 15 * * * pi python3 /home/pi/monit.py
5.2 Monitorizarea video
Transmisiunea video reprezintă procesul prin care imaginile dintr-un punct sunt trimise în mod continuu, către un alt dispozitiv. Dispozitivul care inițiază transmisiunea are rolul de server iar dispozitivul care primește imaginile transmise se numește client. Transmisiunea în mod direct este mult mai eficientă decât descărcarea fișierelor pentru o analizare ulterioară. La descărcarea fișierului video întregul fișier va fi salvat pe dispozitiv, ocupând memorie și mărind timpii de așteptare. Fișierul video care trebuie analizat nu va putea fi redat în timpul descărcării. Acest aspect conduce la întârzieri foarte mari pentru fișierele video care sunt de mărime mare.
La transmisiunea în direct și accesarea acestuia folosind un „browser” întregul conținut este disponibil imediat doar accesând pagina din browser, fără a mai avea nevoie de alți pași adiționali. Video-ul se va încărca porțiune cu porțiune pentru a fi redat utilizatorului, limitând astfel timpii foarte mari necesari descărcării. Informația necesară pentru acest proces, va fi încărcata de „browser” și nu va fi salvată local.
Transmisiunea video se realizează cu ajutorul protocolului de transport UDP (User Datagram Protocol). Informația la acest nivel este sub formă de segmente și este pregătită de transportul prin internet, la acest pas. Acesta funcționează la nivelul 4 al stivei OSI și se bazează pe principiul transmisiei dintr-o locație în alta fără verificare sau retransmitere în caz de segmente pierdute.
Deși aceasta metoda nu de transport nu este convenabila pentru cazurile în care la recepție avem nevoie de datele integrale, complete și corecte (exemplu: afișarea unui mail, în care nu pot lipsi caractere sau alte elemente), are ca avantaj rapiditatea. UDP este folosită pentru video streaming, audio streaming și apeluri video sau audio, deoarece la pierderea unor segmente, mesajul poate fi reconstruit la fel de bine (exemplu: în cazul unei transmisiuni video, dacă nu vor ajunge la destinație câteva cadre, conținutul video-ului va putea fi înțeles de către urmăritorii săi.
Scopul acestei proceduri în cadrul proiectului este de a oferi utilizatorului posibilitatea de a vedea în timp real imagini cu sera prin intermediul oricărui browser web. Se va realiza o transmisiune care poate fi accesata prin LAN dar se va putea extinde la accesare posibila de oriunde atunci când utilizatorul folosește un serviciu de VPN sau de tunel direct intre el și Raspberry Pi.
Procedura de „video streaming” peste web este destul de complicată din cauză că standardele video nu sunt general acceptate de toate browserele și toate platformele. Folosirea HTTP-ului în acest context este justificată de scopul inițial pentru care acesta a fost creat. Protocolul HTTP a fost creat pentru a fi un protocol de pagini web universal acceptat. Inițial multe facilitați puse la dispoziția programatorului de către acest protocol nu erau posibile. [21]
Menționez ca script-ul utilizat în acest subcapitol este preluat din documentația oficiala pentru modulul de camera compatibil cu Raspberry Pi. Am înțeles funcționarea acestui script și toate componentele lui însă modulul este foarte pretențios din punct de vedere al codării, iar scrierea de la zero a unui astfel de cod ar fi avut foarte multe probleme, atât la trecerea intre protocoale cât și de conectare a modului fizic. Codul a fost preluat și adaptat pentru această aplicație, iar site-ul generic creat în HTML a fost adaptat sa reflecte numele și scopul aplicației.
Conform documentației prezentate codul este adaptat pentru a folosi un format de comprimare video mai simplu MJPEG. MJPEG (Motion JPEG) este un format de compresie video în care fiecare cadru sau câmp digital de secvențe video este comprimat separat ca un fișier de tip JPEG. JPEG (Joint Photographic Experts Group) este un format de imagine foarte popular și utilizat la scara largă și suportat pe aproape toate dispozitivele și toate sistemele de operare. Acest format poate avea diferite niveluri de comprimare, datorită acestui fapt JPEG este aproape ideal pentru grafici pe web. Numărul de culori suportate este de peste 16 milioane, făcând imaginile sa aibă calitate și detalii de culoare foarte bune. Acest aspect îl face foarte popular ca format de stocare pentru camerele digitale. Modulul Raspberry Pi Camera V2 folosește acest tip de format pentru realizarea pozelor.
Script-ul este realizat în Python 3 pentru partea de transmisiune video iar pentru afișarea corespunzătoare pe pagina web, este scris în HTML. Se folosesc librăriile „io”, „picamera”, „logging”, „socketserver” , „threading” ,”http”. Librăria „io” este folosită pentru interfațarea cu dispozitivele periferice, iar librăria „picamera” este folosită pentru o interfața intre limbajul de programare Python și modulul de camera pentru Raspberry Pi [22]. „logging” este o librărie ce facilitează autentificarea diferitelor module și este standard intre toate modulele Python.
Codul realizează și finisează aspectul paginii HTML care va fi folosită pentru a vizualiza transmisiunea în timp real cu sera, realizată de modulul de camera. Principiul codului este acela de a inițializa sesiunea, de a pregăti contextul și de a transmite imaginile continuu. „Stream”-ul este creat și direcționat către pagina creată și există verificări, care vor afișa mesaje de eroare în caz ca unele elemente nu returnează răspunsul dorit.
Accesarea transmisiunii video se va face folosind adresa IP locala atribuita plăcii Raspberry Pi. Pentru aflarea acesteia se va accesa terminalul și se va introduce următoarea comandă:
ifconfig
Numele acestei comenzi este „interface configuration” și este folosită pentru a vizualiza și configura interfețe de rețea disponibile pe Raspberry Pi. După rularea acestei comenzi se vor afișa rezultatele conform figurii 5-4.
Figura 5-4
În dreptul interfeței wlan0 se găsește adresa IP care trebuie folosită. În acest caz Raspberry Pi va fi conectat la internet folosind rețeaua „wireless” disponibilă în apartament.
Se va utiliza aceasta adresa pentru a accesa transmisiunea video, folosind orice „browser” web. Adresa folosită pentru accesare va fi de forma: http://ADRESA_IP:8000
Portul 8000 este frecvent utilizat pentru servicii de „streaming”, port alternativ pentru protocolul HTTP sau chiar pentru administrarea web prin HTTP.
Cum se poate vedea și în figura 5-4 adresa IP alocată dispozitivului Raspberry Pi în rețeaua locală este : 192.169.1.5. Folosind adresa de accesare prezentată mai sus se va introduce în browser-ul dorit pentru accesarea imaginilor în direct cu sera.
Figura 5-5
Figura 5-6
În figura 5-5 este prezentată accesarea site-ului în varianta „Desktop” folosind un browser web de pe calculatorul personal. Afișarea este corespunzătoare, mișcarea este fluidă, iar întârzierea de transmisiune este de 1 secunda. Această întârziere nu afectează cu nimic experiența utilizatorului, deoarece nu este o întârziere mare și este aproape nesesizabilă.
În figura 5-6 se poate observa monitorizarea video, accesată de pe telefon. Transmisiunea video este centrată și dacă utilizatorul dorește sa acceseze aceasta pagina de pe telefon, nu va avea nicio problemă.
La transmisiune însă calitatea imaginilor este limitată, acesta fiind un dezavantaj al acestei metode. În cazul acestui proiect calitatea medie a transmisiunii nu afectează experiența utilizatorului dacă acesta ar dori sa vadă în ce stare se află planta. Eventualele probleme cu planta vor putea fi sesizate de utilizator fără probleme (de exemplu, orientarea frunzelor sau direcția în care planta tinde sa se întindă către lumina). Odată constatate aceste probleme utilizatorul va putea sa acționeze cu prima ocazie și sa mute planta într-un loc care este propice dezvoltării ei.
Figura 5-7 reprezintă o imagine extrasa din transmisiunea video. Se pot observa detalii pe frunzele plantei și cât aceasta a crescut. Dacă este ceva în neregula cu frunzele sau apar semne vizibile pe tulpina sau pe frunze, deși imaginea este limitata ca rezoluție, acestea se pot depista la timp.
Figura 5-7
Rezoluția camerei pentru transmisie este de 640×480 și este fixata. Aceasta rezoluție reprezintă rezoluția standardului VGA (Video Graphic Array). Acest standard este folosit atât pentru camere cât și pentru cabluri.
Pentru observarea defectelor minore apărute pe corpul plantei și doar urmărirea acesteia rezoluția VGA este potrivita și nu are dezavantaje majore.
5.3 Monitorizarea creșterii plantei
Pentru urmărirea creșterii plantei în acest proiect se va utiliza modulul de camera Raspberry Pi pentru a capta o imagine care mai apoi va fi prelucrată și se vor recunoaște obiectele din cadrul imaginii pentru a aproxima înălțimea plantei. Notificarea utilizatorului se va face folosind un mail care va fi trimis către acesta și va conține dimensiunea plantei exprimata în milimetri.
Menționez ca pentru realizarea codului din acest sub capitol, algoritmul și prelucrările la care este supusa imaginea sunt preluate din revista oficiala Raspberry Pi. Codul a fost preluat și adaptat pentru necesitățile serei. Am înțeles algoritmul de lucru și prelucrările la care este supusa imaginea. Codul în sine reprezintă o varianta rapida, ca timp de procesare iar alte modificări asupra algoritmului ar fi îngreunat procesul și ar fi mărit timpii de lucru. Codul modificat și adaptat este atașat în Anexa A, pentru evidențierea contribuțiilor aduse [27].
Principiul de funcționare în linii mari este prezentat teoretic în figura 5-8. Imaginea plantei după ce se va recunoaște va fi compara cu dimensiunile unui obiect cunoscut și prin calcule se va determina înălțimea acesteia. La obiectul cunoscut va fi știuta lățimea acestuia notata „l” și introdusă în datele de program, la rularea acestuia. Alegerea obiectului este cruciala pentru aproximarea corecta și apropiata de înălțimea reala a plantei. Obiectul trebuie sa fie unul de baza, fără prea multe laturi și dimensiunea acestuia sa fie comparabila cu planta. Un obiect de dimensiuni prea mici poate atrage după sine calcule incorecte și o aproximare greșita a înălțimii plantei. Procedeul de alegere al obiectului de referință dar și funcționarea programului vor fi detaliate în acest subcapitol.
Figura 5-8
Se va folosi librăria OpenCV care va fi instalată folosind comanda:
pip install opencv-contrib-python==4.1.0.25
Se va folosi versiune 4.1.0.25 deoarece noua versiune de OpenCV (4.1.1) nu este încă stabilă și prezintă erori de instalare și folosire care nu pot fi evitate. Instalarea acestei librarii este una de lungă durată dar care se face fără intervenția utilizatorului.
Algoritmul folosit în codul utilizat presupune mai întâi pregătirea imaginii prin prelucrări care vor fi detaliate mai jos.
Se va începe cu crearea argumentului „-l” care va fi introdus în terminal odată cu comanda de rulare a programului. Pentru acest argument se vor folosi funcțiile implicite din librărie „argparse”. Se va declara „lățimea” , „l” și se va defini tipul acesteia ca fiind float. „l” reprezintă lățimea obiectului ale cărui dimensiuni sunt cunoscute.
Cu ajutorul modulului de camera se va realiza captura unei imaginii la rezoluția stabilita de 1440 x 912. Aceasta imagine va fi reținută pentru o vizualizare ulterioară modificărilor și prelucrărilor. Formatul pozei va fi de tip „BGR” care reprezintă schema de culori (BGR – Blue, Green, Red).
Prima prelucrare asupra imaginii este reprezentată de transformarea din formatul culoare în formatul cu nuanțe de gri (greyscale). În acest tip de transformare fiecare pixel colorat este transformat în echivalentul sau pe o scara de la alb la negru, unde nuanțele de gri reprezintă nivelurile intermediare care vor oferi imaginii un aspect apropiat de cel inițial. Imaginea obținuta în urma conversiei la nuanțe de gri este reținută și salvată sub numele „greyscale”. Aceasta transformare s-a realizat folosind funcția cv2.cvtColor() din librăria OpenCV. Aceasta funcție este folosită pentru schimbări de culoare asupra imaginii și tranziții de culoare care depind de argumentele date în aceasta funcție.
Folosind imaginea obținută și salvată sub numele „greyscale” se va realiza o altă prelucrare menită sa îmbunătățească proprietățile imaginii. Prelucrarea de tip „Gaussian blur” (netezire Gaussiană) reprezintă netezirea imaginii ca rezultat al aplicării unei funcții Gaussiene. Scopul acestei prelucrări este sa reducă zgomotul care este în imagine și sa reducă detaliile. Pentru măsurarea înălțimii plantei este necesar acest pas deoarece avem nevoie ca detaliile nesemnificative (de exemplu: obiecte nedorite în măsurare) sa fie estompate. Imaginea de analizat trebuie sa aibă un nivel de zgomot mic și folosind aceasta prelucrare îmbunătățim calitatea informației din imagine [28]. Aceasta prelucrare se va realiza cu funcția cv2.GaussianBlur(). Argumentele acestei funcții sunt lungimea și lățimea kernelului care reprezintă numere întregi și impare și imaginea pe care se va aplica aceasta transformare. . Kernelul filtrului este reprezentat de o matrice ce conține cifra 1 pe fiecare poziție. Lungimea și lățimea kernelului sunt dimensiunile acestei matrice. După aplicarea acestei transformări se va salva imaginea obținuta tot sub denumirea de „greyscale”, înlocuind imaginea anterioara.
După realizarea celor doua prelucrări pe imagine se va folosi funcția cv2.Canny(). Aceasta funcție are la baza un algoritm de detectarea marginilor. În final după aplicarea acestei funcții se vor obține marginile conținute în imagine, puternic evidențiate [29]. Este nevoie de aplicarea acestei funcții pentru detectarea obiectelor din imagine cât mai bine. Rezultatul funcției „canny” va fi salvat și pe acesta se vor mai aplica alte funcții în continuare. Parametrii de intrare ai funcției cv2.Canny() au fost modificați și adaptați pentru o mai buna recunoaștere a plantelor. Valorile finale care se vor regăsi în lucrare sunt 10 și 140. Aceste doua valori reprezintă „Valoarea minima” și „Valoarea maximă” date ca intrare aceste funcții. Dacă un punct va fi aflat peste valoarea maximă el este considerat o margine sigura. Orice valoare aflata intre valoare minima și valoarea maximă care nu este legata de o margine sigura nu va fi considerata margine.
Se va folosi dilatarea care reprezintă o operație morfologica care are rolul de a modifica o imagine după un anumit element structural impus în proces. Aceasta se va face folosind cv2.dilate(). Efectul creat de dilatare este de a mari formele obținute în imagine pentru accentuarea acestora. Rezultatul dilatării va fi supus erodării folosind funcția cv2.erode() pentru a strânge formele obținute păstrând marginile acestora [30]. După folosirea celor doua operații consecutive se observa ca marginile detectate de funcția cv2.Canny() sunt mult mai bine accentuate iar formele sunt mai drepte și mai ușor de detectat.
După aceste prelucrări, pe imaginea obținuta se vor detecta și sorta contururile. Acestea vor fi organizate de la 1 la r și apoi se vor crea dreptunghiurile care vor încadra obiectele aflate în imagine. Conturul reprezintă o curba care încercuiește un element prezent într-o imagine urmând marginile acestuia în mod continuu. Contururile sunt un element esențial în detectarea și recunoașterea obiectelor [31].
Etapele prin care trece imaginea pot fi vizualizate în figura 5-9 și figura 5-10. Etapa 1 – reprezintă captura imaginii inițiale, etapa 2 este trecerea la nuanțe de gri, etapa 3 este aplicarea netezirii Gaussiene, etapa 4 este detectarea contururilor, etapa 5 este dilatarea imaginii iar etapa 6 este erodarea imaginii. Imaginea finala și obiectele recunoscute în cadrul acesteia reprezintă ultima imagine regăsită în figuri.
Figura 5-9
Figura 5-10
Pentru obținerea contururilor ca fiind elemente distincte și pentru găsirea obiectelor de interes din imagine se va folosi funcția cv2.findContours(). Se vor specifica imaginea de ieșire, modul de găsire și tipul de aproximație.
Modul de aproximație este ales ca fiind cv2.CHAIN_APPROX_SIMPLE, deoarece acest mod de aproximație va aproxima doar cu patru puncte corespondente celor patru vârfuri ale dreptunghiurilor care vor aproxima obiectele.
Acest mod de aproximație nu este unul continuu și salvează timp de procesare și memorie de program. O metoda continua, deși are avantaje fata de aceasta ar fi îngreunat algoritmul și ar fi mărit timpii de procesare. Metoda folosită are rezultatele dorite fără a încărca programul și a suplimenta calculele sau prelucrarea.
În program este nevoie de o condiție pentru numărul de obiecte detectate. Obiectele găsite în imagine trebuie sa fie minim doua într-un caz ideal : obiectul cunoscut și planta. Obiectele recunoscute vor fi de obicei mai multe deoarece plantele au structuri neregulate și recunoașterea acestora ca un singur obiect compact este dificila.
Lumina, poziționarea plantei, așezarea camerei, unghiul camerei și distanta la care aceasta este față de plantă influențează detectarea. Unul dintre cei mai importanți factori pentru o detectare corectă a plantei este lumina. Lumina trebuie sa fie suficientă atât pe obiectele de detectat cât și pe fundal sa existe cât mai puține umbre. Umbrele pot apărea ca obiecte și vor intra în detectare, putând afecta măsurătorile.
Camera va fi situata la aproximativ 40 cm de planta și orientata la un unghi de 90° pentru a nu influenta detectarea și măsurarea plantei și a obiectului.
Planta studiata va fi în permanenta așezata în sera realizată și acolo va fi și măsurată. Elementele aflate în sera nu afectează măsurătorile dacă acestea sunt plasate la un nivel aflat sub înălțimea plantei. De exemplu, în realizarea serei bara de LED-uri care va fi așezata în spatele plantei și aceasta poate altera măsurătorile pentru plantele de dimensiune mai mica. În figura 5-11 este evidențiat acest dezavantaj și cum el poate afecta măsurătorile unor plante de dimensiune redusă.
Figura 5-11
Se poate observa că planta de Yacon (din a doua jumătate a figurii) nu va avea detectarea sau măsurarea afectată de bara de LED-uri montată pe sera. În prima jumătate a pozei este prezentată garofița care are dimensiuni reduse iar poziționarea barei de LED-uri deasupra acesteia afectează detectarea acesteia.
Soluția în acest caz este reprezentată de adaptarea serei la dimensiunile garofiței. Sera a fost conceputa pentru dimensiunile plantei de Yacon iar garofița a fost folosită doar pentru testare. Dacă planta dorita a fi ținuta în sera va fi de dimensiuni mai mici bara de LED-uri se va muta astfel încât sa nu afecteze în niciun fel măsurătorile. Pentru realizarea măsurătorilor și testelor folosind garofița bara de LED-uri a fost acoperita pentru a nu afecta detectarea. Mai multe rezultate și capturi de ecran pentru aceste plante studiate se regăsesc în Anexa B.
În figura 5-12 se poate observa detectarea plantei mai mici (în acest caz garofița) care se realizează fără nicio problema, când se acoperă bara de LED-uri. Aceasta acoperire constituie doar o soluție temporară pentru realizarea acestor măsurători. O soluție permanenta este ce a poziționării barii de LED-uri la nivelul plantei.
Figura 5-12
Alegerea obiectului cunoscut a fost făcută pe baza celor doua criterii menționate anterior : forma și dimensiunile acestuia. Forma obiectului va fi una dreptunghiulara pentru a arăta poziționarea corecta a acestuia dar și pentru evidențierea unghiului sub care camera va capta imagini. Obiectul ales va avea culoarea neagra pentru a fi ușor de recunoscut și diferențiat și va avea o lungime de 11 cm și o lățime de 2cm. Lungimea de 11 cm este o dimensiune care poate fi comparată cu dimensiunile plantelor studiate în acest proiect, și nu alterează în niciun fel rezultatele obținute. În figura 5-13 sunt prezentate diferite poziționări ale obiectului cunoscut și evidențierea greșelilor de poziționare și corectarea acestora.
Figura 5-13
Poziționările 1,2,3 sunt aproape perfecte și conduc la aproximări bune ale dimensiunilor plantei. Poziționarea conform cazului 4 prezintă o mica abatere de la forma dreptunghiulara inițială însă nu afectează calculele și măsurarea plantei. Poziționarea numărul 5 se abate de la forma dreptunghiulară deoarece obiectul cunoscut nu este poziționat perfect vertical. Aceasta poziționare nu afectează măsurătorile. Poziționarea 6 reprezintă o problema din punct de vedere al distantei fata de camera dar și de așezarea verticala a obiectului. Acesta va părea de o lățime mai mare și va afecta calculele. Poziționarea 7 prezintă obiectul inclinat față de cameră, nefiind paralel cu orientarea acesteia. Obiectul va părea de dimensiuni mai reduse, afectând calculele. Poziționarea 8 reprezintă plasarea obiectului prea aproape de camera. Acesta este perceput distorsionat și nu este recunoscut ca fiind un obiect în imagine, deoarece focalizarea pe el nu va avea loc.
Așezarea corespunzătoare a obiectului este necesară pentru o măsurare corecta a plantei. Obiectul trebuie așezat cât mai departe de planta pentru a nu se suprapune cu aceasta și în partea stânga a ecranului pentru a fi primul obiect recunoscut de algoritm.
În Anexa C sunt atașate diferite moduri de recunoaștere pentru plantele 1 și 2.
Odată găsite toate obiectele prin detectarea contururilor acestora ele vor fi organizate de la 1 la n și se va verifica condiția ca acestea sa fie mai mult de doua.
Folosind funcția cv2.approxPolyDP() va aproxima o curba sau un poligon cu o alta curba sau un poligon, care va reține punctele găsite și extrase. Precizia va fi introdusă în argumentele funcției și va fi specificată la valoarea 3 [32].
Se vor crea dreptunghiuri de aproximare folosind cv2.boundingRect () care vor fi reținute în matricea boundRect. Funcția va calcula distantele dintre coordonatele date. Acestea încadrează poziția obiectelor și mențin dimensiunile lor.
Pentru aproximarea dimensiunilor se va calcula câți milimetrii conține un pixel folosind obiectul cunoscut și recunoașterea lui stocata în matricea boundRect.
Poziția fiecărui obiect va fi analizată comparând-se fiecare cu 2 poziții cunoscute (cea mai de sus și cea mai de jos) și se vor ordona în funcție de înălțimea la care sunt situate. Se vor stoca valorile finale în doua variabile care vor retine cel mai de sus dreptunghi și cel mai de jos dreptunghi.
Aceste prelucrări se vor face excluzând primul dreptunghi care reprezintă obiectul cunoscut.
Înălțimea plantei va fi estimata folosind scăderea intre dreptunghiurile semnalate „cel mai sus” și cel mai „jos”. Înălțimea plantei va fi reținută pentru prelucrări ulterioare.
Pe ecran se va deschide o fereastră nouă în care se va afișa o copie a imaginii originale care peste ea va avea un strat ce va conține obiectele încadrate în dreptunghiuri albastre. Pentru crearea acestora se va utiliza funcția cv2.rectangle() care va unii punctele reținute și va crea dreptunghiurile care vor încadra obiectele. Imaginea va fi de dimensiune stabilita (1280 x720) la afișare.
Înălțimea plantei va fi transmisa către utilizator folosind:
SUBJECT="Notificari sera"
TEXT="Inaltimea plantei este {0:.0f} mm".format(plantHeight)
msg='Subject: {} \n\n {}'.format(SUBJECT,TEXT)
server.sendmail("rasp.pi.929@gmail.com","rasp.pi.929@gmail.com",msg)
În figura 5-14 este prezentată structura mail-ului așa cum va fi văzut de către utilizator în contul sau de Gmail. Formatul mail-ului este asemenea celorlalte notificări primite de la sera si este ușor de citit atât pe mobil cât si pe calculator.
Figura 5-14
Pentru testarea corectitudinii măsurătorilor și a transmiterii mail-urilor s-au efectuat pe planta de Yacon 15 măsurători consecutive ale căror rezultate pot fi vizualizate în figura 5-15.
Figura 5-15
Calculele și capturile de ecran atașate acestor măsurători sunt detaliate și explicate în Anexa B. Acest număr mare de mail-uri nu este unul care va fi primit în mod normal de către utilizator deoarece pe zi se va face o singură măsurătoare al cărei rezultat va fi trimis către utilizator.
În fiecare zi se va măsura planta la ora 11:00 și dimensiunea acesteia va fi transmisa către utilizator folosind email-ul propriu.
Pentru aplicarea acestui cod se va scoate afișarea imaginii finale pe ecran pentru ca utilizatorul nu va putea avea acces la aceasta dacă nu are un monitor conectat. Procesul, detectarea și calculele rămân neschimbate iar măsurarea se va desfășura în aceleași condiții.
Pentru rularea scriptului în fiecare zi la ora 11:00 se va edita fișierul cron adăugând :
0 11 * * * pi python3 /home/pi/ masurare.py -l 20
Astfel codul va fi rulat în fiecare zi la ora 11:00 când lumina ambientala este buna iar utilizatorul va putea urmări creșterea plantei în email-urile sale.
Capitolul 6 – Asamblarea finala a serei
Se va realiza o incinta din policarbonat solid care va găzdui planta dar și componentele electronice necesare pentru întreținerea condițiilor din sera și monitorizarea plantei. Aceasta va fi realizată din trei placi de dimensiune 30cm x 40 cm x 2mm îmbinate ca în figura 6-1. În figura 6-1 sunt prezentate construirea serei și modul de așezare al componentelor iar în figura 6-2 este prezentată schema finala și generala a proiectului.
Întreținerea condițiilor plantei se va realiza folosind iluminarea și udarea acesteia, sisteme care for fi montate pe sera pentru interconectare.
În ghiveciul plantei va fi introdus senzorul de umiditate rezistiv care va trimite date către Raspberry Pi. Acesta va primi pe GPIO21 (cum se poate observa în figura 6-2) datele de la senzorul rezistiv și va lua decizia de udare sau nu a plantelor. Se va acționa driverul de motor folosind pinii GPIO07 și GPIO27 pentru a controla pompa care va uda plantele. Driver-ul de motor va fi alimentat de la o sursa de tensiune continua separata, pentru a nu încărca SBC-ul. Odată acționata pompa și udata planta utilizatorul va fi notificat de starea serei. Pompa va fi introdusă într-un recipient cu apa care va conține apa suficientă pentru a putea uda planta pentru un timp mai îndelungat.
Pentru menținerea condițiilor de lumina se va folosi fotorezistorul care va fi montat pe o laterala interioara a serei (cum se poate observa în figura 6-1). Orientarea acestuia se va face către tavan pentru a nu fi influențat de alte surse de lumina, cum ar fi bara de LED-uri. Fotorezistorul va avea curentul limitat folosind un rezistor de 10kΩ. Valoarea curentului prin fotorezistor va fi de 0,5mA. Bara de LED-uri va fi montată la nivelul plantei de peretele central al serei. LED-urile sunt conectate la GPIO05 și respectiv GPIO24 la Raspberry Pi. Curentul prin ele se va limita la valoare de 7mA folosind rezistoare de 470 Ω.
Figura 6-1
Figura 6-2
Citirea de la fotorezistor se va face pe pinul GPIO23 și pe baza acesteia se va lua decizia de iluminare sau nu a plantelor. După iluminarea plantelor utilizatorul va fi notificat de starea serei prin email.
Monitorizarea serei se va realiza urmărind temperatura și umiditatea din incinta, planta în permanență cu ajutorul camerei video și monitorizând creșterea și progresul în înălțime al platei.
Senzorul de temperatură și umiditate va fi așezat lângă un perete al serei și va fi alimentat de la Raspberry Pi. Se va utiliza un rezistor de pull-up de 10kΩ intre pinii 1 și 2 ai senzorului. Raspberry Pi va citi datele de la DHT11 pe pinul GPIO04 și va afișa și prelucra datele. Acestea se vor transmite către utilizator însoțite de alerte dacă în seră nu sunt îndeplinite condițiile pentru temperatura și umiditatea relativă acceptabile pentru dezvoltarea plantei.
Utilizatorul va putea urmări sera în permanență accesând pagina web creată pentru transmisiunea video cu sera. Pentru asigurarea transmisiunii video este necesară conectarea Raspberry Pi la internet și montarea camerei pentru vizualizarea corespunzătoare. Monitorizarea video are ca scop aducerea în atenția utilizatorului a unor probleme ale plantei sesizabile doar dacă aceste se afla lângă plantă. Văzând ca planta are probleme în dezvoltarea ei, utilizatorul poate sa acționeze pentru salvarea plantei sau recuperarea ei.
Progresul plantei în înălțime va fi urmărit folosind camera și utilizatorul va fi notificat în fiecare zi de înălțimea atinsă de plantă. Pentru efectuarea acestei măsurători în seră trebuie introduse obiectul cunoscut față de care se va face compararea și o bandă de culoare neutra ce va acoperi ghiveciul și firele existente în sera. Pregătirea serei pentru măsurarea plantei nu afectează măsurarea în niciun fel și ajuta la încadrarea mai buna a plantei. Materialele folosite pentru acoperirea ghiveciului și realizarea suportului pentru obiectul cunoscut sunt reprezentate de carton și hârtie de culoare alba.
Planta din sera poate fi înlocuită cu orice planta și programele realizate se vor comporta la fel în oricare dintre cazuri. Pentru plantele de dimensiuni mai mici se va muta bara de LED-uri ca aceasta sa fie la nivelul lor și dacă obiectul cunoscut pentru măsurare nu este potrivit, acesta se poate înlocui oricând cu unul adecvat. Un obiect prea mic va duce la aproximări greșite ce pot induce în eroare utilizatorul.
După asamblarea serei și finalizarea sistemului se va realiza un program care va stabili când vor rula codurile de monitorizare astfel încât utilizatorul sa fie notificat doar o dată pe zi, în fiecare zi de parametrii necesari. Aceste ore pot fi schimbate oricând folosind metoda prezentată în acest capitol (modificarea și editarea fișierului „cron”).
În acest proiect alegerea celor doua ore pentru rularea codurilor de monitorizare este o alegere întemeiată și bazată pe criteriile prezentate. Factorii precum lumina care ar putea afecta măsurătorile au fost luați în calcul pe parcursul zilei. De asemenea intervalul orar în care se înregistrează temperatura maximă a zilei a fost principalul criteriu pentru programarea orei la care va rula codul de monitorizare al temperaturii și umidității relative.
Urmărirea progresului și starea serei se vor face foarte ușor, în contul de Gmail sau accesarea transmisiunii video în browser-ul de internet folosită de utilizator. Nu este necesară instalarea de aplicații suplimentare, utilizatorul va avea notificările venite de la sera într-un singur loc, accesibil de pe orice dispozitiv.
La sfârșitul fiecare zile utilizatorul va avea cel puțin 3 email-uri de la sera. Primul email va fi cel de măsurare a plantei care se va trimite la ora 11:00, atunci când lumina este foarte buna. La ora 15:00 se va măsura temperatura din sera și apoi umiditatea acesteia. Acestea se vor regăsi în mail și cu mențiuni sau alerte la detectarea unui parametru care nu este în gamele specificate la început. Lumina se va aprinde cel puțin o dată pe zi în sera atunci când se face întuneric în incinta și utilizatorul va fi notificat prin email. Udarea plantei se va face la aproximativ 3 zile deci utilizatorul va primi aceasta notificare mult mai rar.
Notificările reprezintă modul prin care utilizatorul este pus în legătură cu ce starea plantelor dar și acțiunile întreprinse pentru menținerea condițiilor bune pentru dezvoltare. Textul acestora este scurt, la obiect și are rol strict informativ. Utilizatorul va ști ca planta este în siguranță, este sănătoasă și este luminată și udată constant.
Email-urile pot fi accesate pe orice dispozitiv și conținutul lor va fi sugestiv pentru datele transmise.
Email-urile de alertă vor avea adăugat în titlul din subiect semnul „!” pentru a atrage atenția utilizatorului asupra faptului ca sera are nevoie de intervenția lui și că planta poate avea de suferit din cauza temperaturii sau a umidității ce a depășit valorile acceptate.
În figura 6-3 se pot vedea mail-urile primite de utilizator în ordinea venirii acestora în varianta accesata de pe browser.
Figura 6-3
În acest exemplu se pot vedea cele trei mail-uri de notificare primite de utilizator cât și un mail de alerta , marcat diferit pentru a putea fi sos în evidenta.
Asamblarea finala a proiectului se poate regăsi în figura 6-4 iar componentele și pregătirea serei sunt în figura exact cum au fost prezentate în acest capitol. Odată poziționată sera și toate elementele ei, inclusiv obiectul de detectat și cartonul care ajuta la încadrarea plantei, aceasta nu va mai fi mișcată, pentru a nu afecta recunoașterea plantei.
Figura 6-4
Concluzii generale
În urma realizării practice a proiectului de licență au fost îndeplinite cu succes toate obiectivele propuse; acela de a crea un sistem complet care menține condițiile pentru dezvoltarea plantei și monitorizează atât factorii de mediu cât și dezvoltarea plantei fără a fi nevoia intervenției utilizatorului. Sera bazată pe Raspberry Pi va întreține planta care este plasata în interior și va notifica utilizatorul prin email.
Cum s-a propus inițial proiectul a fost realizat și testat, luând în calcul cel mai important factor: sănătatea plantei și buna dezvoltare a acesteia.
|În cadrul acestui proiect am avut următoarele contribuții:
îndeplinirea tuturor obiectivelor propuse
alegerea senzorilor și a modulelor conform cerințelor proiectului
observarea condițiilor inițiale și a stării plantei
realizarea codurilor de întreținere
crearea legăturii dintre utilizator și sera prin intermediul email-ului
adaptarea și optimizarea codului de recunoaștere și măsurare a plantei
realizarea monitorizărilor precizate și aducerea lor în vederea utilizatorului
crearea unui program de monitorizare luând în calcul factorii de mediu
testarea recunoașterii și măsurării pe diferite plante
adaptarea serei la condiții de recunoaștere a plantei
realizarea fizică a incintei din policarbonat solid și asamblarea sistemului
testarea serei și aducerea de îmbunătățiri finale
Acest proiect a reprezentat o ocazie sa proiectez și sa realizez un sistem complet pentru întreținerea plantelor pe care îl voi folosi pentru planta mea de apartament. Am învățat sa lucrez organizat și sa îmi pun ordine în idei, structurându-le. Împărțirea timpului în mod corespunzător a fost necesară pentru finalizarea acestui proiect. Voi atașa diagrama Gantt în Anexa C unde se pot vedea etapele realizării desfășurate în timp.
Am învățat sa lucrez pe sistemul de operare Raspbian și sa folosesc terminalul pentru comenzile necesare. Limbajul de programare Python este unul accesibil însă necesita multă atenție la indentarea codului. Acest limbaj a fost studiat parțial în anul IV în cadrul disciplinei „Tehnologii de programare în internet” împreună cu noțiuni de baza despre Raspberry Pi. În fazele incipiente ale proiectului aceste noțiuni învățate în cadrul disciplinei au fost o bază solidă pentru programarea SBC-ului.
Proiectul a reprezentat o activitate de lungă durata atât ca și asamblare, testare și optimizare dar și ca documentare asupra diverșilor factori ce influențează buna dezvoltare a plantelor. Rezultatele obținute în urma realizării și testării serei au fost favorabile. Plantele utilizate nu au arătat semne de deteriorare sau îmbolnăvire pe parcursul așezării lor în incinta, dezvoltând-se în mod normal.
Scopul acestui proiect era reprezentat de crearea unui sistem care întreține și monitorizează plantele fără ca utilizatorul sa fie nevoit sa intervină, însă toate acțiunile trebuiau aduse la cunoștința acestuia. După realizarea serei, toate punctele prezentate inițial au fost atinse si sistemul funcționează așa cum s-a dorit inițial.
Posibilități viitoare de dezvoltare
Sera inteligenta va putea fi îmbunătățită pe viitor atât din punct de vedere software dar și hardware. Voi preciza câteva îmbunătățiri viitoare ce pot fi aduse și cum aceasta va putea fi extinsă :
Trecerea la o variantă mai precisa de senzori; la care nu am avut acces din punct de vedere financiar
Îmbunătățirea algoritmului de recunoaștere astfel încât acesta sa nu mai fie atât de sensibil la poziționare
Extinderea serei pentru a putea găzdui mai multe și plante și a întreține condițiile pentru acestea
Folosirea unei camere mai performante care poate înregistra în format HD sau mai ridicat, pentru mai observarea mai multor detalii la transmisiunea video
Realizarea unui sistem de răcire sau umbrire a plantelor
Detectarea și analizarea florilor /fructelor și notificarea utilizatorului de starea acestora
Notificarea mai multor utilizatori , realizând un grup de email
Reținerea datelor măsurate într-o baza de date sau într-un document pentru a fi urmărit progresul de creștere
Bibliografie
[1] „Raspberry Pi 3B” https://www.raspberrypi.org/products/raspberry-pi-3-model-b/ [Accesat 20.04.2020]
[2] „GPIO” https://www.raspberrypi.org/documentation/usage/gpio/ [Accesat 20.04.2020]
[3] „Moisture Sensor” https://wiki.eprolabs.com/index.php?title=Moisture_Sensor [Accesat 16.02.2020]
[4] „Motor driver” https://laborjag.com/venta/arduino/mini-victory-l298n-mx1508-pwm-2-channel-dc-motor-driver/ [Accesat 19.03.2020]
[5] „DHT11” https://robu.în/product/dht-11-digital-temperature-humidity-sensor/[Accesat 12.05.2020]
[6] „Photoresistor”https://www.sciencedirect.com/topics/engineering/photoresistors [Accesat 25.05.2020]
[7]”Camera V2” https://www.raspberrypi.org/products/camera-module-v2/ [Accesat 27.04.2020]
[8] „Raspian ” https://www.raspberrypi.org/documentation/raspbian/[Accesat 03.05.2020]
[9] „Raspian Install” https://www.raspberrypi.org/documentation/installation/installing-images/README.md [Accesat 03.05.2020]
[10]”Commands” https://www.raspberrypi.org/documentation/usage/terminal/ [Accesat 03.05.2020]
[11] „Python – generic aspects” https://docs.python.org/3/using/cmdline.html [Accesat 27.05.2020]
[12] „Python Intro” https://docs.python.org/3/library/intro.html [Accesat 27.05.2020]
[13] „Installing Python 3” https://www.raspberrypi.org/documentation/linux/software/python.md [Accesat 14.02.2020]
[14] „OpenCV” https://opencv.org/about/ [Accesat 27.05.2020]
[15] „Gmail About” https://www.google.com/gmail/about/ [Accesat 14.04.2020]
[16] „SMTP on Raspberry Pi” https://shop.sb-components.co.uk/blogs/posts/how-to-send-an-e-mail-via-raspberry-pi [Accesat 15.04.2020]
[17] „PINS” https://raspi.tv/2013/rpi-gpio-basics-4-setting-up-rpi-gpio-numbering-systems-and-inputs [Accesat 19.05.2020]
[18] „Motor control” https://www.instructables.com/id/Tutorial-for-Dual-Channel-DC-Motor-Driver-Board-PW/ [Accesat 12.04.2020]
[19] „PWM” https://sourceforge.net/p/raspberry-gpio-python/wiki/PWM/ [Accesat 11.04.2020]
[21] „Web streaming” https://picamera.readthedocs.io/en/latest/recipes2.html#web-streaming [Accesat 15.05.2020]
[22] „Picamera” https://picamera.readthedocs.io/en/release-1.13/ [Accesat 20.05.2020]
[23] „Logging” https://docs.python.org/2/library/logging.html [Accesat 20.05.2020]
[24] „Temperature and humidity”https://www.houseplantsexpert.com/indoor-plants-temperature-guide [Accesat 08.06.2020]
[25] „Daily temperature” https://www.thoughtco.com/high-and-low-temperature-timing-3444247 [Accesat 08.06.2020]
[26] „Humidity” https://home.howstuffworks.com/how-to-care-for-house-plants3 [Accesat 09.06.2020]
[27] „ Measure” https://magpi.raspberrypi.org/articles/monitor-plant-growth-ai-opencv [Accesat 8.02.2020]
[28] „ Image Filtering” https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_filtering/py_filtering.html [Accesat 11.06.2020]
[29] „Canny Edge Detection” https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_canny/py_canny.html [Accesat 11.06.2020]
[30] „Morphological Transformation” https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html [Accesat 11.06.2020]
[31] „ Contours” https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_contours/py_contours_begin/py_contours_begin.html [Accesat 11.06.2020]
[32]” Aprox Poly DP” https://www.docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html [Accesat 12.06.2020]
[33] „ Bound Rectangles” https://docs.opencv.org/3.4/da/d0c/tutorial_bounding_rects_circles.html [Accesat 12.06.2020]
Anexa A
Cod Pyrhon – sol.py
import RPi.GPIO as GPIO
import time
import smtplib
# autentificare
server=smtplib.SMTP('smtp.gmail.com',587)
server.starttls()
server.login("rasp.pi.929@gmail.com","PAROLA")
# creare mail
SUBJECT="Notificari sera"
TEXT="Planta a fost udata."
msg='Subject: {} \n\n {}'.format(SUBJECT,TEXT)
#initializare numarator
num=0
#initializare si declarare pini; setare pwm software
GPIO.setwarnings(False)
umiditate = 21
GPIO.setmode(GPIO.BCM)
GPIO.setup(umiditate, GPIO.ÎN)
GPIO.setup(27, GPIO.OUT)
GPIO.setup(07, GPIO.OUT)
pwm=GPIO.PWM(07,100)
pwm.start(0)
#citirea de la senzorul de umiditate cu pauza de 1 secunda intre citiri
while True:
if GPIO.input (umiditate)
print ("sol uscat")
print ("udare plante")
num=num+1
pwm.ChangeDutyCycle(50)
GPIO.output(07, True)
GPIO.output(27, False)
if num == 2:
server.sendmail("rasp.pi.929@gmail.com","rasp.pi.929@gmail.com",msg)
else:
print ("sol ud")
num=0
pwm.stop()
GPIO.output(07, True)
GPIO.output(27, True)
time.sleep(1)
server.quit()
GPIO.cleanup()
Cod Python – lum.py
import RPi.GPIO as GPIO
from time import sleep
import smtplib
#autentificare
server=smtplib.SMTP('smtp.gmail.com',587)
server.starttls()
server.login("rasp.pi.929@gmail.com","PAROLA")
SUBJECT="Notificari sera"
TEXT="Lumina pentru crestere a fost aprinsă."
msg='Subject: {} \n\n {}'.format(SUBJECT,TEXT)
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
num=0
Foto = 23
LED1= 24
LED2= 05
GPIO.setup(Foto,GPIO.ÎN ,pull_up_down=GPIO.PUD_UP)
GPIO.setup(LED1,GPIO.OUT)
GPIO.setup(LED2,GPIO.OUT)
while True:
stare_lumina = GPIO.input(Button)
print(button_state)
if stare_lumina== 1:
num=num+1
GPIO.output(LED1,GPIO.HIGH)
GPIO.output(LED2,GPIO.HIGH)
if num == 2:
#trimitere email
server.sendmail("rasp.pi.929@gmail.com","rasp.pi.929@gmail.com",msg)
else:
num=0
GPIO.output(LED1,GPIO.LOW)
GPIO.output(LED2,GPIO.LOW)
sleep(1)
Cod Python monitorizare.py
import RPi.GPIO as GPIO
import Adafruit_DHT
import time
import sys
import smtplib
server=smtplib.SMTP('smtp.gmail.com',587)
server.starttls()
server.login("rasp.pi.929@gmail.com",”PAROLA")
DHT_SENSOR = Adafruit_DHT.DHT11
DHT_PIN= 4
t_baza = 24.00
h_mare = 60.00
h_mic = 50.00
if True:
humidity,temperature = Adafruit_DHT.read(DHT_SENSOR,DHT_PIN)
if humidity is not None and temperature is not None:
print("Temperatura={0:0.1f}C Umiditate={1:0.1f}%".format(temperature,humidity))
if (temperature > t_baza) and (humidity > h_mic) and (humidity < h_mare):
SUBJECT="Alerta Sera!"
TEXT="Temperatura este " + str(temperature) + " C" +"\n Umiditatea este " + str(humidity) + "%" + "\n Temperatura este peste 24 C. "+ "\n Mutati planta!"
elif (temperature < t_baza) and (humidity > h_mic) and (humidity < h_mare):
SUBJECT="Notificari sera"
TEXT="Temperatura este " + str(temperature) + " C" +"\n Umiditatea este " + str(humidity) + "%" + "\n Temperatura si umiditatea sunt normale"
else :
if (temperature > t_baza):
SUBJECT="Alerta sera!"
TEXT="Temperatura este " + str(temperature) + " C" +"\n Umiditatea este " + str(humidity) + "%" + "\n Umiditatea relativă nu are o valoare admisibila." + "\n Temperatura este peste 24 C" + "\n Mutati planta! "
else:
SUBJECT="Alerta sera!"
TEXT="Temperatura este " + str(temperature) + " C" +"\n Umiditatea este " + str(humidity) + "%" + "\n Umiditatea relativă nu are o valoare admisibila "
msg='Subject: {} \n\n {}'.format(SUBJECT,TEXT)
server.sendmail("rasp.pi.929@gmail.com","rasp.pi.929@gmail.com",msg)
server.quit()
Cod Python masurare.py
import argparse
import imutils.contours
import cv2
from picamera.array import PiRGBArray
from picamera import PiCamera
from time import sleep
import smtplib
server=smtplib.SMTP('smtp.gmail.com',587)
server.starttls()
server.login("rasp.pi.929@gmail.com","Parola")
#l – reprezinta latimea obiectului cunoscut
parser = argparse.ArgumentParser(description= Masurare inaltime')
parser.add_argument("-l", "–latime", type=float, required=True)
args = vars(parser.parse_args())
# Realizare fotografie
camera = PiCamera()
rawCapture = PiRGBArray(camera)
sleep(0.1)
camera.capture(rawCapture, format="bgr")
image = rawCapture.array
# Transformari pe imagine
greyscale = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
greyscale = cv2.GaussianBlur(greyscale, (7, 7), 0)
# Detectarea marginilor si inchiderea gaurilor
canny_output = cv2.Canny(greyscale, 10, 140)
canny_output = cv2.dilate(canny_output, None, iterations=1)
canny_output = cv2.erode(canny_output, None, iterations=1)
# Se vor crea contururi organizate de la 1 la r
contours, _ = cv2.findContours(canny_output, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
if len(contours) < 2:
print("Prea putine obiecte")
exit(0)
(contours, _) = imutils.contours.sort_contours(contours)
contours_poly = [None]*len(contours)
boundRect = [None]*len(contours)
for i, c în enumerate(contours):
contours_poly[i] = cv2.approxPolyDP(c, 3, True)
boundRect[i] = cv2.boundingRect(contours_poly[i])
output_image = image.copy()
mmPerPixel = args["latime"] / boundRect[0][2]
highestRect = 1000
lowestRect = 0
for i în range(1, len(contours)):
if boundRect[i][2] < 50 or boundRect[i][3] < 50:
continue
if highestRect > boundRect[i][1]:
highestRect = boundRect[i][1]
if lowestRect < (boundRect[i][1] + boundRect[i][3]):
lowestRect = (boundRect[i][1] + boundRect[i][3])
#Realizare dreptunghi pentru afisare
cv2.rectangle(output_image, (int(boundRect[i][0]), int(boundRect[i][1])),
(int(boundRect[i][0] + boundRect[i][2]),
int(boundRect[i][1] + boundRect[i][3])), (255, 0, 0), 2)
# Calcularea inaltimii plantei – diferenta intre dreptunghiul situat cel mai sus si dreptunghiul situat cel mai jos inmultit cu milimetrii asociati per pixel.
plantHeight = (lowestRect – highestRect) * mmPerPixel
print("Inaltimea plantei este {0:.0f}mm".format(plantHeight))
SUBJECT="Notificari sera"
TEXT="Inaltimea plantei este {0:.0f} mm".format(plantHeight)
msg='Subject: {} \n\n {}'.format(SUBJECT,TEXT)
server.sendmail("rasp.pi.929@gmail.com","rasp.pi.929@gmail.com",msg)
#afisarea imaginii finale care cuprinde recunoasterea si incadrarea
Rresized_image = cv2.resize(output_image, (1280, 720))
cv2.imshow("Image", resized_image)
cv2.waitKey(0)
server.quit()
Anexa B
Capturi de ecran realizate în procesul de măsurare a celor 3 plante folosite
Tabel B-1
Observații:
În cele 4 poze atașate în tabelul B-1 se observa ca modificarea orientării plantei afectează modul în care ea este percepută. Aceste măsurători au fost realizate cu modulul de camera fixat la 90° și acesta nu se va mișca pe parcursul acestor măsurători.
Se constată că la fiecare mișcare a plantei și a orientării frunzelor aceasta va fi percepută diferit însă măsurătorile nu vor fi afectate major. Numerele sunt apropiate cum se poate vedea in Tabelul B-2.
Pentru corectitudinea măsurătorilor odată așezata planta în poziția dorită aceasta nu va mai fi mișcata pe parcursul măsurătorilor.
Dimensiunea plantei de Yacon la momentul măsurării:
L=20,3cm (203 mm)
Media aritmetica celor 4 măsurători :
La=20,425 (204,25 mm)
Eroarea absolută :
e = |20,3 cm – 20,425 cm| = 0,125 cm (1,25 mm)
Eroarea relativă:
ε = = 0,0061=0,61%
Tabel B-2
Tabel B-3
Tabel B-4
Observații:
Această plantă are o structură mai compactă și mai ușor de detectat. Orientarea spre cameră nu va afecta nici în acest caz măsurătorile.
Dimensiunea plantei la momentul măsurării:
L=12,6 cm (126 mm)
Media aritmetică celor 2 măsurători :
La=11,9 cm (119 mm)
Eroarea absoluta:
e = |12,6 cm – 11,9cm| = 0,7 cm (7 mm)
Eroarea relativă:
ε = = 0,0555=5,55%
Tabel B-5
Observații:
Planta 3 care conține flori de culoare albă este greu de detectat iar măsurătorile nu se efectuează corespunzător. Algoritmul care analizează marginile și contururile are probleme în detectarea obiectelor albe pe fundal alb. Acesta reprezintă un dezavantaj al metodei folosite.
Soluție: folosirea unui fundal de altă culoare pentru măsurarea plantei cu flori albe.
Înălțimea plantei la momentul măsurării: 17,2 cm (172 mm)
Deoarece Planta 3 nu a fost detectată corespunzător din cauza problemei cu fundalul alb, pe datele obținute în urma măsurătorii ei nu se vor mai face calcule pentru aflarea erorilor.
Anexa C
Figura C-1
Figura C-2
Recunoașterea celor doua plante s-a făcut corespunzător după ajustarea prelucrărilor și după eliminarea factorilor care influențează măsurarea. În spatele serei trebuie sa fie un cadru de culoare alba care sa reducă șansele de detectare a altor obiecte în afara plantei.
În figura C-1 se poate observa că detectarea plantei de Yacon se realizează corect indiferent de orientarea frunzelor acesteia.
Deși recunoașterea plantei se realezează diferit, adică dreptunghiurile care încadrează obiectele imaginii corespunzătoare plantei au poziții diferite și este foarte probabil ca la măsurări repetate ele sa aibă așezări diferite în cadrul imaginii și numărul lor să varieze.
Detectarea celei de a doua plante s-a făcut în aceleași condiții de lumină și așezare și se poate constata în figura C-2 ca recunoașterea ei nu variază chiar atât de mult datorită structurii ei „adunate” și compacte.
În ambele cazuri studiate acest fapt nu influențează măsurarea și precizia măsurării. Poziția și și dimensiunea dreptunghiurilor nu va afecta măsurătorile în niciun fel, decât în cazul unor detectări greșite.
Anexa D
Figura D-1
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Seră inteligentă cu monitorizare video [301873] (ID: 301873)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
