Dizertatie Anescu Mihai Sebastian Pcsam 2018 [628267]

Universitatea POLITEHNIC A București
Facultatea Automatică și Calculatoare
Departamentul Automatică și Informatică Industrială

LUCRARE DE DIZERTA ȚIE

MONITORIZAREA ȘI AUTOMATIZAREA
SERELOR FOLOSIND MICROCONTROL LER-UL
ARDUINO UNO

Coordonator: Absolvent: [anonimizat].univ. Dr.Ing. Dan Popescu MIHAI -SEBASTIAN ANESCU

2018

2
CUPRINS

Capitolul 1. INTRODUCERE
1. Introducere ………………………….. ………………………….. ………………………….. …………………… 8
1.1. Motivare ………………………….. ………………………….. ………………………….. …………………….. 8
1.2. Abordarea de proiectare ………………………….. ………………………….. ………………………….. 8
Capitolul 2. TEMA PROIECTULUI
2. Tema proiectului ………………………….. ………………………….. ………………………….. …………… 8
2.1 Prezentare generală a sistemului ………………………….. ………………………….. ……………….. 9
Capitolul 3. MONITORIZAREA ȘI CONTROLUL SISTEMULUI
3. Monitorizarea și controlul sistemului ………………………….. ………………………….. …………. 11
3.1. Monitorizarea sistemului ………………………….. ………………………….. ……………………….. 11
3.2. Hardware ………………………….. ………………………….. ………………………….. …………………. 11
3.2.1. Arduino UNO ………………………….. ………………………….. ………………………….. ………… 11
3.2.2. DHT11 Senzor de temperatur ă și umiditate ………………………….. ……………………….. 12
3.2.3. Senzorul de lumină DFRobot ………………………….. ………………………….. ……………….. 14
3.2.4. Senzorul de temperatură DS18B20 ………………………….. ………………………….. ……….. 15
3.3. Software ………………………….. ………………………….. ………………………….. …………………… 16
3.3.1. DHT11 Senzor de temperatur ă și umiditate ………………………….. ……………………….. 16
3.3.2. Senzorul de lumină DFRobot ………………………….. ………………………….. ……………….. 17
3.3.3. Senzorul de temperatură DS18B20 ………………………….. ………………………….. ……….. 17
3.3.4. Integrarea ………………………….. ………………………….. ………………………….. ……………… 17
3.4. Controlul sistemului ………………………….. ………………………….. ………………………….. ….. 19
3.4.1. Hardware ………………………….. ………………………….. ………………………….. ………………. 19

3
3.4.2 . MD10C Conducatorul Motorului ………………………….. ………………………….. …………. 19
3.4.3. Ecranul de declansare a sunetului ………………………….. ………………………….. ………… 20
3.4.4. 8507840 Actuatorul liniar ………………………….. ………………………….. …………………….. 20
3.4.5. Motor rotativ Denso 730557 7030 L ………………………….. ………………………….. ………. 21
3.4.6. Feedback -uri ………………………….. ………………………….. ………………………….. ………….. 21
3.5. Software ………………………….. ………………………….. ………………………….. …………………… 22
3.5.1. Modul de control manual ………………………….. ………………………….. …………………….. 23
3.5.2. Controlul automat logic ………………………….. ………………………….. ……………………….. 23
3.5.3. Integrarea ………………………….. ………………………….. ………………………….. ……………… 24
Capitolul 4. IMPLEMENTAREA SOLU ȚIEI
4. Implementarea solu ției ………………………….. ………………………….. ………………………….. …. 26
4.1. Sistemul de comunicare wireless ………………………….. ………………………….. ……………… 26
4.2. Hardware ………………………….. ………………………….. ………………………….. …………………. 26
4.2.1. Xbee S2 ………………………….. ………………………….. ………………………….. …………………. 28
4.2.2. Xbee adaptor USB ………………………….. ………………………….. ………………………….. ….. 29
4.2.3 Scutul Xbee ………………………….. ………………………….. ………………………….. …………….. 29
4.3. XTCU Software ………………………….. ………………………….. ………………………….. ………… 30
4.4. Arduino Software ………………………….. ………………………….. ………………………….. ……… 31
4.5. Web server ………………………….. ………………………….. ………………………….. ……………….. 32
4.5.1. Hardware ………………………….. ………………………….. ………………………….. ………………. 32
4.5.2 . Arduino Mega ………………………….. ………………………….. ………………………….. ………… 32
4.6. Software ………………………….. ………………………….. ………………………….. …………………… 33
4.7. Inițializare ………………………….. ………………………….. ………………………….. ………………… 33

4
4.8. Interogare ………………………….. ………………………….. ………………………….. ………………… 33
4.9. Interfa ța Web ………………………….. ………………………….. ………………………….. …………… 37
4.10. Biblioteci JavaScript ………………………….. ………………………….. ………………………….. … 37
Capitolul 5. REZULTATE ȘI DISCUTII
5. Rezultate și discutii – Pagina de logare ………………………….. ………………………….. ……….. 38
5.1. Pagina de interfa ță ………………………….. ………………………….. ………………………….. ……. 39
5.2. Înregistrarea datelor ………………………….. ………………………….. ………………………….. …. 40
5.3. Modificari de proiectare ………………………….. ………………………….. …………………………. 41
5.4. Pozi ția ferestrei ………………………….. ………………………….. ………………………….. …………. 41
5.4.1. Senzorul ultrasonic ………………………….. ………………………….. ………………………….. …. 41
5.4.2. Comutatorul Reed ………………………….. ………………………….. ………………………….. ….. 41
5.4.3. Comutatoare de contact ………………………….. ………………………….. ………………………. 42
5.5. Operarea ferestrelor ………………………….. ………………………….. ………………………….. ….. 42
5.5.1. Motor rotativ ………………………….. ………………………….. ………………………….. …………. 42
5.6. Conexiunea la server -ul WEB ………………………….. ………………………….. …………………. 42
Capitolul 6. CONCLUZII
6. Concluzii ………………………….. ………………………….. ………………………….. …………………….. 43
6.1. Considera ții viitoare ………………………….. ………………………….. ………………………….. ….. 43
BIBLIOGRAFIE ………………………….. ………………………….. ………………………….. ………… 44
Anexa 1 Codul sursă al plăcii ARDUINO UNO ………………………….. ………………………….. . 46
Anexa 2 Codul sursă al plăcii ARDUINO ATMEGA2560 ………………………….. ……………. 56
Anexa 3 Codul sursă al Interfeței WEB ………………………….. ………………………….. …………. 66
Anexa 4 Codul sursă al paginii de Logare Website ………………………….. ……………………… 71

5
Lista Figurilor

Figura 2-1 . Sera Buller ………………………….. ………………………….. ………………………….. ………………… 9
Figura 2-2 Prezentare generală a sistemului. ………………………….. ………………………….. …………….. 10
Figura 3-1: Conexiunile senzorilor de umiditate. ………………………….. ………………………….. ……….. 12
Figura 3-2: Conexiunile senzorilor de lumină. ………………………….. ………………………….. …………… 14
Figura 3-3: Conexiuni senzor de temperatură. ………………………….. ………………………….. …………… 16
Figura 3-4: Carcasa sistemului de monitorizare. ………………………….. ………………………….. ……….. 18
Figura 3 -5: Motor și curea DC. ………………………….. ………………………….. ………………………….. ……. 21
Figura 3 -6: Comutatoare de feedback. (a) Comutatorul de deschidere a ferestrei. (b) Închideți
comutatorul de ferestre. ………………………….. ………………………….. ………………………….. ……………… 22
Figura 3 -7: Diagrama automată de control. ………………………….. ………………………….. ………………. 24
Figura 3 -8: Carcasa sistemului de control. ………………………….. ………………………….. ………………… 25
Figura 4 -1: Conectarea între controlerul principal și adaptorul XBee USB ………………………….. . 27
Figura 4 -2: Configurare pentru controlerul slave cu router XBee ………………………….. ……………. 27
Figura 4 -3: Rețea XBee mesh (C -Coor donator, R -Router, E -End Point). ………………………….. ….. 28
Figura 4 -4: Arduino Mega cu coordonatorul XBee ………………………….. ………………………….. …….. 29
Figura 4 -5: Configurarea configurației parametrilor XBee ………………………….. ……………………… 30
Figura 4 -6 XTCU Intefata software ………………………….. ………………………….. ………………………….. 30
Figura 4-7: Diagrama fluxului serverului web. ………………………….. ………………………….. ………….. 36
Figura 5-1: Pagina de conectare pe diferite platforme. (a) Google Chrome rulează pe un PC. (b)
Safari care rulează pe un iPhone. ………………………….. ………………………….. ………………………….. … 38
Figura 5-2: Pagina de interfață pe diferite platforme. (a) Internet Explorer rulează pe un PC. (b)
Google Chrome rulează pe un iPhone ………………………….. ………………………….. ……………………….. 39
Figura 5-3: Widget -ul meteo imediat sub Figura 6 -4 (a) ………………………….. ………………………….. 40

6
Lista tabelelor

Tabelul 3-1 Arduino UNO specificatii ………………………….. ………………………….. ……………. 12
Tabelul 3-2: Specificațiile tehnice ale senzorului de umiditate. ………………………….. ……… 13
Tabelul 3-3: Specificația tehnică a senzorului de lumină ………………………….. ……………… 14
Tabelul 3-4: Specificația tehnică a senzorului de temperatură. ………………………….. …….. 15
Tabelul 3 -5: Tabelul logic al controlerului motorului. ………………………….. …………………. 20
Tabelul 3 -6: Moduri automate de control ………………………….. ………………………….. ………. 23
Tabelul 4 -1: specificațiile XBee S2 ………………………….. ………………………….. ………………… 28
Tabelul 4 -2: Tabelul de date de tip serial. ………………………….. ………………………….. ………. 31
Tabelul 4-3: specificațiile Arduino Mega. ………………………….. ………………………….. ………. 33
Tabelul 4-4: Tabel de solicitări valide. ………………………….. ………………………….. …………… 35

7
Abrevieri

Arduino – microcontroler cu sursă deschisă
GUI – Interfață grafică pentru utilizatori
Html – limbaj de marcare hipertext
HTTP – Protocol de transfer de hipertext
IP – Protocol Internet
MAC – controlul accesului media
PC – Calculator personal
PWM – modulație cu lățimea impulsului
RH – Umiditate relativă
Shield – plăci periferice proiectate pentru a interfața cu ușurință cu microcontrolerele
Arduino
URL – Uniform Resource Locator
WPA2 – Wi-Fi Protected Access II
Xbee – transceiver wireless de joasă putere

8
Capitolul 1.

1.Introducere
1.1.Motivare
Sera Buller ( Figura 2-1 ) a fost construita in anii 1960 pentru a găzdui o varietate de plante
utilizate în scopuri didactice și de cercetare. Clădirea în sine este formată din nouă camere, fiecare
având propriile condiții climatice . Principala preocupare pentru fiecare dintre aceste camere este
sa rămân a la o temperatură adecvată , in functie de tipul de plante din fiecare incapere in parte. În
lunile de vară, acest lucru se face în primul rând prin deschiderea și închiderea manuală a
ferestrelor. Acest lucru presupune ca personalul să vina la munca în fiecare zii inclusiv in weeken d,
dacă temperatura exterioară devine prea mare.
1.2. Abordarea de proiectare
Microcontrolerele Arduino au fost alese din cauza familiarității cu limbajul C și a varietății
și disponibilității dispozitivelor periferice.Prin accesul la componente în timp u til a fost respectat
programul de lucru stabilit în propunere.Pentru a permite o dezvoltare mai ușoară a proiectului , a
fost aleasă o abordare modulară de proiectare. Proiectul a fost împărțit în 4 subsisteme principale:
sistemul de monitorizare, sistemul de control, sistemul de comunicații fără fir și interfața de
utilizator. Acest lucru a permis o depanare mai ușoară și a ajutat la realizarea fără probleme a fazei
de integrare a proiectului.
Capitolul 2.

2. Tema proiectului
Scopul lucrării este de a implementa un sistem care să permită monitorizarea și controlul
de la distanță pentru a reduce timpul necesar ca nd personalul trebuie să fie prezent în seră.
Domeniul de aplicare al proiectului a fost de a produce un sistem de monitorizare și control
pentru o încăpere din sera Buller. Acest sistem poate fi accesat de la distanță folosind un server

9

web pe orice dispozitiv conectat la internet. Acest proiect ar putea fi ușor extins pentru utilizare în
toate încăperile din seră, astfel încât fiecare cameră să poată fi automatizată.
2.1. Prezentare generală a sistemului
Acest proiect utilizează două microcontrolere Arduino într -o configurație master / slave
pentru a obține citiri de senzori și pentru a opera comenzile de temperatură pentru sere. Pentru
controlerul principal a fost aleasă Arduino Mega 2560. Acest controler transmite semnale de
control și primește date senzoriale de la controlerul slave printr -o perech e de transmițătoare XBee.
Pentru controllerul slave a fost selectat un Arduino UNO, care este responsabil pentru colectarea
și transmiterea datelor. Acestea includ citirea temperaturii, umidității și intensității luminii, precum
și introducerea semnalului de control al recepției . O vizualizare a prezentării sistemului poate fi
văzută în Figura 2-2.

Figura 2-1 . Sera Buller

10

Figura 2-2 Prezentare generală a sistemului.

11
Capitolul 3.
3.Monitorizarea si controlul sistemului
3.1.Monitorizarea sistemului
Scopul principal al sistemului de monitorizare este de a obține citirea temperaturii din seră
care va fi transmisă unui utilizator de la distanță. În plus, sistemul a fost extins pentru a include
monitorizarea intensității umidității și a luminii ca parametri doriți. Acești parametri sunt
alimentați înapoi în sistemul nostru de control pentru a permite controlul automat. În prezent,
sistemul de control are capacitatea de a controla tempera tura datorită limitărilor hardware
existente . În seră, însă în viitoarele proiecte, umiditatea automată și controlul iluminării ar putea fi
ușor implementate. Componentele de proiectare ale sistemului de monitorizare sunt împărțite în
două secțiuni princip ale: hardware și software.
3.2.Hardware
Sistemul de monitorizare este alcătuit din patru senzori de interfață cu microcontrolerul
slave Arduino UNO. Acesti senzori includ: senzor de temperatura, senzor de umiditate, senzor de
intensitate a luminii si doua comutatoare de contact care determina daca geamul este deschis sau
inchis. Datele senzorilor sunt transmise wireless către Arduino Mega unde este înregistrat .
3.2.1.Arduino UNO
Arduino UNO a fost aleasă ca microcontroler slave. UNO este o placă de microco ntrolere
bazată pe chipul ATmega328P. UNO furnizează 14 știfturi I / O digitale împreună cu șase pini de
intrare analogice. Sistemul de monitorizare a necesitat un total de opt pini digitali și trei pini
analogi care fac Arduino UNO un candidat perfect. UN O are o viteză de 16 MHz și o memorie
flash de 32 KB, care a fost mai mult decât suficientă pentru a rula și procesa codul sistemului de
monitorizare. Mai jos sunt prezentate în tabelul 3-1 specificațiile UNO Arduino [1].

12

Tabelul 3-1 Arduino UNO specificatii

3.2.2. DHT11 Senzor de temperatura si umiditate
DHT11 este un senzor dual de temperatură și umiditate, ceea ce înseamnă că poate citi atât
temperatura, cât și umiditatea. Chiar dacă are o funcționare dublă, este utilizată doar ca senzor de
umiditate. Un senzor de temperatură cu precizie mai mare este im plementat în schimb. Acest
senzor utilizează o comunicare serială care este fiabilă și are stabilitate pe termen lung. DHT11
necesită un rezistor de tracțiune, aproximativ 5 K, care să fie plasat între firul de date și alimentarea
cu tensiune. Acest lucru împiedică pivotul de intrare să plutească într -o stare nedefinită sau să fie
ridicat dacă senzorul a fost deconectat. Specificația tehnică de mai jos din Tabelul 3-2 prezintă o
prezentare generală a senzorului de umiditate DHT11. Figura 3-1 prezintă conexi unile DHT11 cu
Arduino UNO [ 11].

Microcontroller Atmega328P

Operating
Voltage 5V

Supply Voltage 7-12V

DC Cuurent per
I/O Pin 20 mA

Flash Memory 32 KB

Clock Speed 16 MHz

13

Parameters Conditions Minimum Typical Maximum

Resolution 1% RH 1% RH 1% RH
8 bit

Accuracy 25°C ±4% RH
0-50°C ±5% RH

Measurement 0°C 30% RH 90% RH
Range 25°C 20% RH 90% RH
50°C 20% RH 80% RH

Response Time 1/e(63%) 25°C 6s 10s 15s
(Seconds) 1m/s Air

Tabelul 3-2: Specificațiile tehnice ale senzorului de umiditate.

Figura 3-1: Conexiunile senzorilor de umiditate.

14

3.2.3. Senzor ul de lumină DFRobot
Senzorul de lumină DFRobot utilizează un fototranzistor care emite o tensiune DC în
funcție de nivelul luminii ambientale. Arduino citește acest lucru ca o valoare analogică de la 0 la
1024. Intervalul maxim al acestui senzor este de 6000 Lux, care se trad uce la o ieșire de 1024.
Aceste valori sunt trimise serverului web unde lumina ambientală din seră poate fi monitorizată
de un utilizator de la distanță. Specificațiile senzorului de lumină sunt prezentate mai jos în Tabelul
3-3. Figura 3-2 prezintă conexi unile senzorilor de lumină cu Arduino UNO [ 7].

Tabelul 3-3: Specificația tehnică a senzorului de lumină

Figura 3-2: Conexiunile senzorilor de lumină. Supply Voltage 3.3V to 5V

Illumination Range 1 Lux to 6000 Lux

Response Time (Seconds) 15µs

Interface Analog

Size 22x30mm(0.87"x1.18")

15
3.2.4. Senzor ul de temperatură DS18B20
Termometrul digital DS18B20 oferă măsurători de temperatură de 9 -50 grade Celsius,
care comunică printr -o magistrală de 1 fir care necesită doar o singură linie de date pentru a
comunica cu Arduino UNO. Utilizarea rezoluției pe 12 biți durează mai mult pentru a procesa pe
DS18B20, dar din moment ce viteza nu este o problemă, re zoluția mai mare merită. Modelul
DS18B20 este compus din 4 componente principale, care includ o memorie ROM pe 64 de biți,
un convertor analog -digital, memoria scratchpad și senzorul de temperatură în sine. ROM -ul pe
64 de biți deține adresa unică a senzor ului. Acest lucru permite ca mai mulți senzori DS18B20 să
comunice pe un singur pin digital. Pentru proiect a fost folosit un singur DS18B20 , totuși acest
lucru este ușor de expandat pentru a permite monitorizarea temperaturii în mai multe locații.
Scratc hpad -ul deține valoarea senzorului de temperatură de 2 octeți și se actualizează atunci când
este recepționată o comandă de citire. Ca și senzorul DHT11 este necesar un rezistor de tracțiune.
Tabelul 3-4 prezintă specificațiile pentru senzorul de temperatu ră DS18B20 [ 13]. Figura 3-3
prezintă conexiunile DS18B20 cu Arduino UNO.
Parameter Conditions Minimum Typical Maximum

Temperature -55°C +125°C
Range

Supply Voltage Local Power +3V +5.5V

Thermometer -10°C to +85°C +15°C to +30°C ±0.5°C
Error -55°C to +125°C ±2°C

Active Current Vsupply = 5V 1mA 1.5mA

Tabelul 3-4: Specificația tehnică a senzorului de temperatură.

16

Figura 3-3: Conexiuni senzor de temperatură.

3.3. Software
Software -ul de monitorizare este scris în limba Arduino și este implementat pe sclavul
Arduino UNO. Cei trei senzori sunt chemați la fiecare 5 secunde și apoi valorile sunt trimise la
masterul Arduino Mega prin Xbee.
3.3.1. DHT11 Senzor de temperatura si umiditate
Senzorul de umiditate este citit de Arduino de la pinul digital 10. Senzorul DHT11 vine cu
o bibliotecă pregătită pentru Arduino, ceea ce permite o integrare ușoară în orice sistem. Senzorul
DHT funcționează pe un sistem de comunicație cu 1 fir și 2 căi. A rduino va trimite mai întâi un
semnal de înaltă calitate pentru DHT, apoi DHT -ul va trimite înapoi pachetul de date. Acest pachet
de date este alcătuit după cum urmează: date de umiditate integrală de 8 biți + date de umiditate
zilnică de 8 biți + date int egrale de temperatură pe 8 biți + date de zecimale pe 8 biți + suma de
verificare de 8 biți pentru un total de 40 de biți. Acest proces durează aproximativ 4 ms.

17
3.3.2. Senzor ul de lumină DFRobot
Când Arduino primește valoarea senzorului de lumină de la pinul analogic 2, acesta este
tradus de la 0 -1024 la 0 -100%. Acest lucru oferă utilizatorului un număr inteligibil care poate fi
utilizat pentru a evalua intensitatea luminii din cameră.
3.3.3. Senzor ul de temperatură DS18B20
Transmisia de date a senzorului de temperatură este implementată pe știftul digital 9.
Funcția senzorului digital caută mai întâi magistrala fir cu fir pentru toate dispozitivele
disponibile, în cazul nostru există doar una. Dacă nu se găsesc dispozitive sau dacă se găsește un
dispozitiv cu o adresă necorespunzătoare, acesta returnează -1000. Apoi se scrie în camera
senzorului prima adresă pentru a inițializa conversia analog -digital. După aceea, funcția poate
trimite o comandă de citire către scratchpad și primește o valoare digitală în schimb. Această
valoare este apoi convertită de la binară la zecimal și returnată ca un flotant. Acest proces este apoi
repetat pentru toate celelalte dispozitive de pe magistrala 1 .
3.3.4. Integrarea
Toți senzorii sunt co nectați la Arduino UNO printr -o placă de prototipare care poate fi
lipită. În viitor, acest lucru ar putea fi schimbat la un PCB. Arduino UNO și placa de prototip sunt
ținute într -o carcasă din plastic de 221x150x60 mm. Ecranul LCD este montat pe partea fr ontală a
carcasei pentru a permite utilizatorului accesul facil la condițiile camerei de seră. Sistemul de
monitorizare este alimentat de un adaptor de alimentare de 9V 1A care se conectează la o priză de
perete standard de 120V. O fotografie a setării inc intei poate fi văzută în Figura 3-4.

18

Figura 3-4: Carcasa sistemului de monitorizare.

19
3.4. Controlul sistemului
Metoda actuală pentru controlul temperaturii în seră implică deschiderea și închiderea
manuală a ferestrelor. Scopul principal al sistemului de control este de a permite ferestrelor să fie
controlate de la distanță folosind un motor electric. Scopul secund ar este de a automatiza acest
proces în cazul în care ferestrele sunt deschise sau închise fără a interacționa omul. Acest lucru
este realizat prin folosirea citirilor de temperatură obținute de sistemul de monitorizare pentru
determinarea modului de contr ol selectat.
3.4.1. Hardware
Sistemul de control este alcătuit din două componente majore care se imbina cu
microcontrolerul Arduino UNO. Aceste componente sunt: motorul de curent continuu folosit
pentru a deschide și închide ferestrele de seră și control erul motorului de curent continuu folosit
pentru controlul acestuia. În plus, a fost inclus un releu de 250 V ac care utilizează semnale de
comandă de 5 V de la Arduino, care ar putea fi utilizate pentru a controla dispozitive suplimentare
de control al te mperaturii, cum ar fi răcitoare de mlaștină sau încălzitoare.
3.4.2. MD10C Conducatorul Motorului
Conducătorul motorului MD10C introduce intrarea de la microcontroler pentru a controla
direcția fluxului de curent de la sursa de alimentare de 12V la motorul DC. Aceasta controlează
direcția motorului și permite deschiderea sau închiderea ferestrei. Conducătorul este controlat de
intrările în pinii DIR (direcția) și PWM (modulația pulsului) [ 6].
Șteful DIR controlează direcția în care motorul se rotește, iar pinul PWM permite controlul
vitezei motorului, luând valori de intrare de la 0 -255 ale microcontroler. Tabelul logic poate fi
văzut mai jos în Tabelul 3 -5.

20
Input Pins Window Response

PWM DIR

LOW X None

HIGH LOW Open Window

HIGH HIGH Close Window

Tabelul 3 -5: Tabelul logic al controlerului motorului.
3.4.3. Ecranul de declansare a sunetului
Ecranul de declanșare a sunetului cu 2 canale de 5V este alcătuit din două relee SRD –
05VDC -SL-C care pot fi utilizate pentru a comuta dispozitivele de până la 250V AC cu până la
10A de curent folosind semnale de intrare 5V de la microcontrolerul Arduino [ 9]. Acest dispozitiv
activ redus , activează releul când primește un semnal de 0V și este dezactivat atunci când
recepționează un semnal diferit de zero. Acest dispozitiv adaugă capacitatea de a funcționa
dispozitive suplimentare de control al temperaturii în seră, cum ar fi răcitoare de mlaștină sau
încălzitoare.
3.4.4. 8507840 Actuatorul liniar
Actuatorul liniar 8507840 este componenta originală aleasă pentru a deschide și a închide
ferestrele de seră. Folosind o sursă de curent continuu de 12V, servomotorul poate ridica până la
270 lbs, cu o lungime de 15 cm [ 12]. În faza de testare, abordarea pentru deschiderea ferestrelor a
fost modificată de la utilizarea unui actuator liniar la utilizarea unui motor rotativ, deoarece este
mai ușor de implementat cu comenzile existente cu efect de seră care funcționează manual. Acest
lucru a permis testarea mai puțin intruzivă a sistemului în seră și a minimizat hardware -ul de
montare necesar.

21

3.4.5. Motor rotativ Denso 730557 7030 L
Motorul rotativ a fost ales ca înlocuitor al actuatorului liniar. Este montat pe peretele de
seră chiar sub m aneta existentă de manevră a ferestrei. Motorul este conectat la controlul manual
al ferestrei, printr -o centură și o roată care rotesc maneta care deschide și închide fereastra. Motorul
730557 7030 L poate fi acționat cu viteze diferite care sunt setate d e puterea furnizată. Cel mai
mare avantaj al unui motor rotativ asupra dispozitivului de acționare liniar este acela că sistemul
de comandă manual existent poate fi utilizat în continuare fără a fi nevoie să scoateți motorul.
Sistemul motor instalat poate fi văzut mai jos.

Figura 3 -5: Motor și curea DC.
3.4.6. Feedback -uri
Pentru a vă asigura că motorul nu deplasează fereastra prea mult într -o direcție, am ales să
folosim o pereche de întrerupătoare de contact pentru a determina poziția absolută a ferestrei. Un
comutator este utilizat pentru a trimite un semnal LOW când fere astra este deschisă complet și un
alt switch este utilizat pentru a trimite un semnal LOW când fereastra este complet închisă.
Comutatoarele sunt conectate în modul normal închis. Acest lucru a fost facut astfel incat in cazul

22

in care se rupe o conexiune s au se pierde puterea, motorul nu va functiona. Când microcontrolerul
primește una dintre aceste semnale, acesta trimite un semnal de control la controlerul motorului
pentru a reduce puterea motorului care deschide și închide fereastra. Întrerupătoarele de contact
necesită rezistențe de împingere pentru a împiedica ca intrarea digitală să plutească.

Figura 3 -6: Comutatoare de feedback. (a) Comutatorul de deschidere a ferestrei. (b) Închideți
comutatorul de ferestre.

3.5. Software
Software -ul sistemului de control are două moduri de funcționare: manuală și automată. În
modul manual sistemul de control primește comenzi de utilizator de la serverul web care sunt
utilizate pentru a acționa dispozitivele de control al temperaturii. Modu l automat utilizează intrarea
temperaturii din sistemul de monitorizare pentru a acționa dispozitivele de control al temperaturii
atunci când temperatura din seră se încadrează în anumite intervale. Codul sistemului de control
poate fi văzut în Anexa A.

23
3.5.1. Modul de control manual
În timpul funcționării manuale, sistemul de control primește date de la utilizator prin
intermediul a două comutatoare de buton și două comutatoare de comutare pe interfața grafică.
Cele două butoane sunt utilizate pentru a des chide fereastra și pentru a închide fereastra, în timp
ce butoanele de comutare sunt utilizate pentru răcitorul de mlaștină și comenzile de încălzire. GUI
poate fi accesat pe site de către oricine cu autorizație care să permită personalului din seră sa
acționeze comenzile de temperatură în afara amplasamentului. Comenzile sunt trimise de la
controlerul principal către controlerul slave prin intermediul transmițătorilor XBee.
3.5.2. Controlul automat logic
Sistemul automat de comandă a fost programat pentru patru intervale de temperatură și
comenzile asociate, acestea fiind prezentate mai jos în tabelul 3 -6.
Temperature Range Control Output

Window Heat Cooler

R1 Closed On Off

R2 Closed Off Off

R3 Open Off Off

R4 Open Off On

Tabelul 3 -6: Moduri automate de control
Reducerea numărului de moduri de operare la doar patru, permițând dezvoltarea mai
eficientă a codului. Modul automat de control utilizează o metodă de sondare pentru a verifica în
mod continuu ce interval de temperatură se încadrează în seră. Acest lucru s e face folosind
declarațiile cazului de comutare care se comută cu citirea curentă a temperaturii obținută de la

24

sistemul de monitorizare. Structura logică pentru modul de control automat poate fi văzută în
schema de dezvoltare din Figura 3 -7.

Figura 3 -7: Diagrama automată de control.
După ce valoarea temperaturii este actualizată, programul verifică pentru a vedea în ce
domeniu se încadrează temperatura. Starea ferestrei este apoi verificată prin citirea comutatoarelor
de feedback înainte de efectuarea oricăror acțiuni de control. Odată ce fereastra este mutată în
poziția corectă, controlerul motorului este oprit prin setarea parametrului winControl LOW care
este conectat la pinul PWM al controlerului motorului; acest lucru asigură că motorul este decuplat.
În cele din urmă semnalele de comandă a încălzitorului și ventilatorului sunt trimise la releul cu 2
canale prin setarea parametrilor fanControl și heatControl la HIGH sau LOW.
3.5.3. Integrarea
Controlerul motorului DC este închis într -o ca rcasă din plastic de 167x107x53 mm.
Comutatoarele de reacție și firele de semnal ale controlerului motorului DC sunt conectate la o
placă de prototipare care poate fi lipită și în carcasa din plastic. Aceste fire sunt conectate la carcasa

25

sistemului de mon itorizare printr -un cablu. Controlerul motorului DC și motorul sunt alimentate
de un adaptor de alimentare de 5A de 12V decât să se poată conecta la o priză de perete standard
de 120V. Mai jos este o fotografie a sistemului de închidere a sistemului de con trol din Figura 3 –
8.

Figura 3 -8: Carcasa sistemului de control.

26
Capitolul 4.
4. Implementarea solutiei

4.1. Sistemul de comunicare wireless
Un sistem de comunicații fără fir a fost ales pentru a transmite date între controalele
principale și slave pentru a oferi sistemului posibilitatea de a fi ușor de extins. Acest lucru permite
administratorului principal să comunice cu controale slave supli mentare care ar putea fi utilizate
pentru extinderea sistemului la încăperile suplimentare din seră. Un alt avantaj al comunicației fără
fir este acela că reduce numărul de pini necesari pe controlerul principal pentru transferul de date.
Acest tip de comu nicare necesită un singur canal de comunicație serială pe controlerul principal
pentru a comunica cu mai mulți controlori slave din seră. În plus, comunicarea wireless elimină
sarcina de a avea nevoie de un sistem complex de fire în toată sera.
4.2. Hardware
Pentru a implementa comunicațiile fără fir între controalele master și slave, au fost selectați
transceiverele XBee. XBees sunt ușor de interconectat cu Arduino datorită disponibilității
scuturilor Arduino care permit transmițătorilor să fie monta ți direct la plăcile Arduino. XBee
îndeplinește, de asemenea, cerințele de gamă ale proiectului, deoarece poate fi creată o rețea de
rețele XBees unde punctele intermediare acționează ca și rutere între Coordonatorul XBee și End
Point XBee.
Coordonatorul X Bee se conectează la placa de bază Mega Arduino printr -un adaptor USB.
Adaptorul USB utilizează pinii TX1 și RX1 pentru comunicație serială deoarece pinii TX0 și RX0
sunt utilizați pentru comunicația ecranului Ethernet. Această configurare este prezentată mai jos
în Figura 4 -1. Routerul XBee comunica cu Arduino UNO printr -un scut XBee. Ecranul se
conectează cu pinii RX și TX ai Arduino UNO. Setarea slave poate fi văzută mai jos în Figura 4 –
1. În prezent, sistemul nu are un punct final XBee, deoarece se moni torizează doar o singură
cameră, dar acest lucru ar putea fi adăugat cu ușurință pentru a extinde capacitățile sistemului.

27

Figura 4 -1: Conectarea între controlerul principal și adaptorul XBee USB
Diagrame de conectare Conexiuni:
• TX1pin -ul de pe Arduino se conectează la adaptorul USB XBee RX (Data in)
• RX1pin -ul de pe Arduino se conectează la Adaptorul USB XBee TX (Data out)
• Pinii 5V, GND și Reset al Arduino sunt conectați la 5V, GND și Resetarea Adaptorului
USB respectiv.

Figura 4 -2: Configurare pentru controlerul slave cu router XBee

28

4.2.1. Xbee S2
Două XBees sunt necesare pentru a satisface nevoile proiectului. Primul XBee acționează
ca un coordonator care primește date și trimite comenzi de control către al doilea XBee. Acest al
doilea XBee funcționează ca un router care comunică cu alte puncte de terminare sau cu routere.
Pe baza dimensiunilor serii, XBee S2 au fost alese pentru comunicații fără fir deoarece au o gamă
mai mare de operare decât modelul XBee de putere inferioară.

Figura 4 -3: Rețea XBee mesh (C -Coordonator, R -Router, E -End Point).
Specification XBee (S2)

Indoor/Urban Range Up to 300 ft. (90 m), up to 200 ft (60
m)

Supply Voltage 3.0 – 3.4 V

Transmission Power Output 10mW (+10 dBm)

Operating Current (Transmission, max 295mA (@3.3 V)
output power)
170mA (@3.3 V)

Operating Current (Receive) 45 mA (@3.3 V)

Operating Temperature -40 to 85ș C

Tabelul 4 -1: specificațiile XBee S2 [8]

29

4.2.2. Xbee adaptor USB
Adaptorul XBee este necesar pentru două funcții, primul fiind ca adaptor pentru
configurarea parametrilor XBee. Acest lucru se face prin intermediul software -ului XCTU explicat
în secțiunea 4.2. A doua funcție este conectarea coordonatorului XBee la Arduin o Mega. Folosind
un adaptor în locul unui scut pentru coordonator, XBee permite XBee să se conecteze la pinii TX1
și RX1 ai lui Arduino Mega. Acest lucru previne interferența cu XBee și Arduino la compilarea
codului pe Arduino. Mai jos, în Figura 4 -4 este o fotografie a Arduino Mega și configurarea
adaptorului.

Figura 4 -4: Arduino Mega cu coordonatorul XBee.
4.2.3. Scutul Xbee
Este necesar un ecran pentru a conecta XBee -ul la Arduino UNO. Acest lucru previne
necesitatea unei cablari complicate și lasa pini de intrare / ieșire suplimentari disponibili pentru
utilizare. Ecranul afișează, de asemenea, starea modulului XBee pe LED -urile de bord care se
aprind când XBee este conectat la rețea [ 15]. Acest lucru ajută la testarea și configurarea.

30

4.3. XTCU Software
Software -ul XCTU este folosit pentru a configura XBee. Adaptorul USB este necesar
pentru conectarea XBee la un calculator pentru configurare cu software -ul XTCU. Software -ul
XCTU este necesar pentru a configura mai multe XBees pentru a comu nica între ele într -un sistem
de rețea cu plasă. Aceste XBees sunt configurate pentru a comunica folosind plăcuțele seriale pe
plăcile Arduino. Configurațiile parametrilor pot fi găsite în Anexa E. Setările de configurare și
software -ul pot fi văzute mai j os în Figura 4 -5 și Figura 4 -6, respectiv [1 4].

Figura 4 -5: Configurarea configurației parametrilor XBee

Figura 4 -6 XTCU Intefata software

31
4.4. Arduino Software
Pentru a interfața XBee cu Arduino, o tabelă de căutare a fost proiectată pentru a clasifica
datele transferate între controalele principale și slave. Tabela de căutare poate fi văzută mai jos în
Tabelul 4 -2. Înainte de a transfera orice date către celelalte XBee, o etichetă de date unică este
atribuită acelui tip de date și est e trimisă mai întâi, urmată de datele în sine. Codurile pornesc de
la 101. De exemplu, atunci când controlerul slave trimite 30 ° C către controlerul principal, va
trimite mai întâi 101 pentru a semnala că datele de temperatură vor fi transmise prin comuni cație
serială.
Data Tag Data types

101 Temperature

102 Humidity

103 Light intensity

104 Window open

105 Window close

106 Control mode: Manual

107 Control mode: Auto

Tabelul 4 -2: Tabelul de date de tip serial.
În viitor, când vor exista mai multe XBees în sistem, codul nostru va trebui modificat
pentru a recunoaște adresa sursă mare și mică a datelor care sunt transferate către masterul
Arduino.

32
4.5. Web server
Serverul web este găzduit pe Arduino Mega. Acesta poate fi accesa t de orice dispozitiv
conectat la internet, cum ar fi telefoane inteligente sau PC -uri, utilizând adresa IP a serverului ca
adresă URL. Serverul web este responsabil pentru trimiterea valorilor senzorilor de seră primite,
precum și a interfeței web către b rowserele utilizatorilor conectați. De asemenea, primește comenzi
de la utilizatori și răspunsuri în consecință.
4.5.1. Hardware
Un scut Ethernet este utilizat pe Arduino Mega pentru a permite conectarea la internet [ 2].
O cartelă micro SD de 8 GB este conectată la slotul de card SD al plăcii de pe placă, care este
utilizat pentru stocarea fișierului paginii web html. În plus, Ethernet oferă o conexiune mai fiabilă,
iar conexiunea Ethernet existentă în seră folosește o adresă IP de rețea extinsă, ceea ce înseamnă
că utilizatorii pot accesa adresa IP din orice locație.
4.5.2. Arduino Mega
Placa de microcontroler Arduino Mega a fost aleasă ca comandant principal pentru a găzdui
serverul web și coordonatorul XBee. Arduino Mega rulează pe ATmega1280 și are 5 4 de pinuri I
/ O digitale, precum și 16 pini de intrare analogic. Motivul principal pentru selectarea Mega se
datorează memoriei flash crescute de 128 KB. Acest lucru oferă suficient spațiu pentru a găzdui
serverul web, precum și software -ul de înregistra re a datelor. Mai jos, în Tabelul 4-3 este o listă
sumară a specificațiilor Mega [ 3]

Microcontroller Atmega1280

Operating Voltage 5V

Supply Voltage 7-12V

DC Cuurent per I/O Pin 40 mA

33
Flash Memory 128 KB

Clock Speed 16 MHz

Tabelul 4-3: specificațiile Arduino Mega.
4.6. Software
Serverul web este conținut în codul programului Arduino Mega. Utilizează biblioteca
Ethernet pentru conectivitate, precum și biblioteca SD pentru accesarea cardului SD [ 4]. Odată ce
programul este inițializat , acesta începe să monitorizeze și să proceseze continuu conexiunile
clienților. Codul pentru serverul web poate fi găsit în Anexa B.
4.7. Initializare
Programul asigură mai întâi că fișierele html și fișierul de parolă pot fi găsite deoarece
serverul nu poate funcționa fără aceste fișiere. Programul încearcă apoi să stabilească o conexiune
la o rețea WI -FI. În cele din urmă,programul încarcă fișierul de parolă și stochează parola în
memorie pentru utilizare ulterioară..
4.8. Interogare
Metoda de interogare este utilizată pentru a asculta conexiunile clientului. În fiecare buclă,
programul testează dacă există sau nu o solicitare de conectare. Dacă se găs ește o solicitare,
programul citește linia antetului său și utilizează metode de procesare a șirurilor pe linie pentru a
afla scopul cererii. Serverul acceptă numai anumite cereri și toate celelalte solicitări vor fi ignorate.
Descrierile cererilor valide, liniile lor de antet și răspunsurile serverului corespunzătoare sunt
listate în Tabelul 4-4.

34
Header Request Description Server Response

GET / HTTP/1.1 A new client connects. The pass.htm is sent to the client.

GET The client submits a password of If the password is correct, send
/password_xxxxx “xxxxx”. client index.htm; if not, redirect
client back to pass.htm.

GET /para The client is requesting for An array of corresponding values
temperature, humidity and light is sent to the client.
intensity values as well as control
mode, window, fan and heat status.

GET /auto The client is trying to set the control Signal is sent to set slave Arduino
system to automatic mode. to automatic mode.

GET /manual The client is trying to set the control Signal is sent to set slave Arduino
system to manual mode. to manual mode.

GET /openWin The client is requesting the window Signal is sent to slave Arduino to
to be open. open window.

GET /closeWin The client is requesting the window Signal is sent to slave Arduino to
to be closed. close window.

GET /fanOn The client is requesting the fan to be Signal is sent to slave Arduino to
turned on. turn on fan.

GET /fanOff The client is requesting the fan to be Signal is sent to slave Arduino to
turned off. turn off fan.

35
]
GET /heatOn The client is requesting the heat to be Signal is sent to slave Arduino to
turned on. turn on heat.

GET /heatOff The client is requesting the heat to be Signal is sent to slave Arduino to
turned off. turn off heat.

Tabelul 4.4: Tabel de solicitări valide.

36

Figura 4.7: Diagrama fluxului serverului web.

37
4.9. Interfata Web
GUI este localizat pe o pagină web găzduită de masterul Arduino, care permite
utilizatorilor să vizualizeze și să ajusteze mediul de seră pe browserele lor. Principalul avantaj al
utilizării unei interfețe de utilizator bazate pe pagina web este că este co mpatibil cu majoritatea
dispozitivelor în comparație cu o interfață bazată pe aplicație, unde diferite versiuni ale aplicației
trebuie create pentru diferite platforme (de exemplu, iOS, Android etc.). Un alt avantaj al utilizării
unei interfețe bazate pe p agina web este că nu este necesară instalarea și aceeași bucată de cod are
aceeași funcție ca și în diferite browsere și dispozitive. Adresa URL a interfeței web este adresa
IP a maestrului Arduino. La accesarea site -ului web, utilizatorul este rugat să in troducă parola
corectă înainte de a putea accesa pagina interfeței. Codul principal de interfață web poate fi găsit
în Anexa C.
4.10. Biblioteci JavaScript
Pentru a atinge obiectivele acestui proiect HTML -ul de baza si JavaScript nu sunt
suficiente. Pentr u a avea acces la funcționalități mai mari, sunt necesare alte biblioteci JavaScript.
Acestea pot fi preluate gratuit de pe serverul de gazduire. JQuery și AccuWeather au fost cele două
biblioteci suplimentare necesare. JQuery este cea mai răspândită bibli otecă JavaScript din lume
[11]. Acesta susține JavaScript și XML (Ajax) asincron care permit actualizarea unei părți a paginii
web fără a fi necesară actualizarea întregii pagini. Acest lucru este esențial pentru proiect deoarece
actualizează datele de mon itorizare și câmpurile de comandă fără a reface interfața. JQuery are, de
asemenea, funcționalitate cross -platform, deci este susținută atât de PC -uri, cât și de telefoane
mobile. Biblioteca widget AccuWeather este necesară pentru utilizarea widget -ului me teo de la
accuweather.com. Widget -ul poate fi văzut în Figura 5-3.

38

Capitolul 5.
5. Rezultate si discutii – Pagina de logare

Figura 5-1: Pagina de conectare pe diferite platforme. (a) Google Chrome rulează pe un
PC. (b) Safari care rulează pe un iPhone.
O pagină de conectare este o funcție de securitate necesară pentru a asigura că interfața
poate fi accesată numai de persoane autorizate. Acest lucru este important deoarece utilizarea
necorespunzătoare a interfeței (cum ar fi deschiderea une i ferestre în timpul iernii) ar putea duce
la deteriorarea plantelor. Când un utilizator se conectează la serverul web, apare o fereastră pop –
up care îi cere utilizatorului să introducă o parolă pentru a continua. Dacă parola introdusă este
corectă, utiliz atorul va fi redirecționat către interfața cu utilizatorul. Parola este stocată în fișierul
"password.txt" de pe cardul SD de pe server. Parola poate fi setată de administrator prin simpla
modificare a fișierului "password.txt". Codul paginii de conectare poate fi găsit în Anexa D.
Pagina de conectare este afișată pe diferite interfețe de mai sus în Figura 5-1.

39

5.1. Pagina de interfata

Figura 5-2: Pagina de interfață pe diferite platforme. (a) Internet Explorer rulează pe un
PC. (b) Google Chrome rulează pe un iPhone
Pagina de interfață este locul în care utilizatorii pot vizualiza și controla mediul din seră.
Pagina este programată astfel încât, la fiecare 5 secunde, pagina trimite o solicitare GET / para
către serverul web, serverul web ră spunde prin trimiterea unui șir care conține valorile de
temperatură, umiditate și intensitate a luminii, precum și modul de control, fereastra , starea
ventilatorului și a căldurii. Pagina interfeței apoi extrage și afișează valorile. Butoanele sunt
utilizate pentru a introduce comenzile utilizatorilor, inclusiv setarea modului de comandă,
precum și comenzile ferestrei, ventilatorului și căldurii. De fiecare dată când este apăsat un
buton, se execută un bloc de cod de program și se trimite o cerere corespu nzătoare HTTP GET
către server. Fluxul de programe poate fi vizualizat mai jos în Figura 5-2.

40

În jumătatea inferioară a paginii de interfață, este inclus un widget vreme furnizat de
accuweather.com. Ar fi convenabil pentru că atunci când utilizatorul folo sește controlul
ferestrelor pentru a regla temperatura camerei, utilizatorul ar putea să știe vremea în afara serii.
Acest widget arată, de asemenea, vremea în următoarele două zile și în următoarele cinci ore de
care utilizatorul ar putea fi interesat. Ac cuweather.com este unul dintre cele mai bune site -uri
web care oferă un widget fiabil și de vreme exacte.

Figura 5-3: Widget -ul meteo imediat sub Figura 5-2 (a)
5.2. Înregistrarea datelor
La fiecare 5 secunde, datele sunt extrase din variabilele senzorului și transformate în șiruri
de caractere. Aceste șiruri sunt concatenate în format CSV și scrise într -un fișier text de pe cardul
microSD de 8 GB. Utilizatorul poate apoi să elimine cardul SD și să transfere cu ușurință datele
care trebuie vizual izate în Excel. La fiecare cinci secunde, aproximativ 25 de caractere sunt scrise
în fișierul text, echivalent cu 25 de octeți de date. Cu această rată, puteți salva 50 de ani de date
înainte de a umple capacitatea cardului SD.

41
5.3. Modificari de proiectar e
De-a lungul întregului proiect au fost făcute multe modificări atât hardware -ului, cât și
software -ului pentru a obține un design complet funcțional. Aceste schimbări au fost făcute ca
răspuns la problemele descoperite în fazele de proiectare, prototip, integrare și testare.
5.4. Pozitia ferestrei
În proiectarea inițială, poziția geamului urma să fie determinată prin trimiterea semnalelor
de comandă a motorului pentru o perioadă de timp și prin cunoașterea vitezei la care mecanismul
de acționare liniar se deschide și se închide. Această metodă a fost respinsă deoarece nu există nici
o formă de feedback a poziției absolute a ferestrei către microcontroler. Acest lucru lasă deschisă
posibilitatea ca dispozitivul de acționare să se extindă prea mult și să d eterioreze fereastra.
5.4.1. Senzorul ultrasonic
Pentru a obține un feedback precis privind poziția ferestrei, a fost ales un senzor ultrasonic
care poate fi utilizat pentru a determina cât de departe este un obiect departe de senzor. Cu toate
acestea, du pă testare pe banc a fost stabilit că senzorul cu ultrasunete ar putea să nu fie suficient
de precis pe cont propriu pentru a determina cât de departe fereastra sa deschis. Pentru a se asigura
că fereastra nu s -ar deschide prea mult, sa decis că un senzor suplimentar pentru a detecta când
fereastra sa deschis într -un anumit punct pentru a completa senzorul ultrasonic care ar fi utilizat
pentru a determina dacă fereastra este închisă.
5.4.2. Comutatorul Reed
Pentru a completa senzorul cu ultrasunete, a fost ales un comutator de trestie care trimite
un semnal HIGH cand fereastra sa deschis complet. După efectuarea modificărilor la motorul
utilizat pentru a deschide fereastra în faza de testare și primirea feedback -ului de la consilieri,
combinația dintre comu tatorul de trestie și senzorul ultrasonic pentru a detecta poziția ferestrei a
fost respinsă.

42
5.4.3. Comutatoare de contact
În proiectarea finală se folosesc două întrerupătoare pentru a determina dacă fereastra este
complet deschisă sau complet închisă. Aceste întrerupătoare au fost montate cu ușurință în
apropierea barei rotative și au fost declanșate când o bandă atașată la aceasta este atașată la
comenzile de control ale ferestrei manuale. Aceasta a eliminat necesitatea de a avea senzori în
afara clădirii unde ar fi expuși elementelor. Prin utilizarea acestor comutatoare, posibilitatea de a
detecta poziția ferestrei care ar putea apărea din utilizarea celorlalte metode a fost mult redusă.
Acest lucru a redus riscul de deteriorare a ferestrelor de seră prin deschiderea lor prea departe.
5.5. Operarea ferestrelor
O modificare importantă a designului făcut hardware -ului în aces t proiect a schimbat
metoda utilizată pentru a deschide ferestrele de seră. Inițial, un actuator liniar a fost ales, totuși,
după ce a încercat să -l instaleze în seră și consultând consultantul proiectului, sa decis că un motor
rotativ ar fi o soluție mai bună.
5.5.1. Motor rotativ
Pentru a profita de hardware -ul existent de control al ferestrelor din seră a fost instalat un
motor rotativ care este compatibil cu controlerul motor existent. Această soluție "drop in" a fost
integrată cu ușurință cu designul original și a permis testarea produsului să continue fără întârzieri
semnificative.
5.6. Conexiunea la server -ul WEB
În faza de proiectare am planificat să profităm de conexiunea Wi -Fi din seră. Cu toate
acestea, după unele cercetări, am constatat că prot ocolul de securitate pentru conexiunea Wi -Fi
este WPA2 -Enterprise, care nu este acceptat de majoritatea scuturilor Wi -Fi pentru Arduino. A
trebuit să trecem la Ethernet pentru o conexiune fiabilă în costul limitării locației fizice a lui
Arduino pentru a f i aproape de portul Ethernet.

43
Capitolul 6.

6. Concluzii
Scopul acestui proiect a fost proiectarea și construirea unui sistem de monitorizare și
control de prototip de lucru pentru o încăpere a serii Buller. Acest sistem permite utilizatorului să
obțină citiri de temperatură, umiditate și intensitate a luminii, precum și să trimită comenzile de
control al temperaturii de la distanță. Acest lucru a fost realizat utilizând microcontrolerele
Arduino și transceiverele wireless XBee. Procesele de proiectare hardware, proiectarea de
software, integrarea și testarea sis temului prototip au fost descrise în acest raport. Proiectul a fost
împărțit în patru secțiuni principale: monitorizare, control, comunicații fără fir și server web / GUI.
Fiecare secțiune individuală a fost testată înainte de a fi integrată în proiectul f inal. Un prototip
complet integrat a fost construit și testat pe banc pentru a asigura funcționarea corespunzătoare
înainte de instalarea în seră. Sistemul a funcționat așa cum a fost proiectat și a fost capabil să
monitorizeze de la distanță și să control eze temperatura serelor. Prin testarea cu succes a
prototipului sa demonstrat că acest sistem ar putea fi extins pentru a acoperi toate încăperile din
seră.
6.1. Consideratii viitoare
Deși designul a avut succes, există îmbunătățiri care ar putea fi făcute în viitoarele adaptări
ale acestui proiect. Una dintre aceste îmbunătățiri ar fi adăugarea de timbruizare a timpului la
sistemul de înregistrare a datelor pentru a face datele mai utile. O altă posi bilă îmbunătățire ar fi
adăugarea dispozitivelor de control al umidității în sera care nu există în prezent. În cele din urmă,
controalele de iluminare ar putea fi adăugate la sistem utilizând același lucru prin extinderea
numărului de relee utilizate.

44

BIBLIOGRAFIE
[1] Arduino, “ Arduino Uno & Arduino Genuino ”. [Online].
https://www.arduino.cc/en/Main/ArduinoBoardUno [Accesat 2018]
[2] Arduino. Ethernet Library Reference [Online].
https://www.arduino.cc/en/Reference/Ethernet [Accesat 2017 ]
[3] Arduino, “ Arduino Mega ”. [Online].
https://www.arduino.cc/en/M ain/ArduinoBoardMega [Accesat 2017 ]
[4] Arduino. Web Server Example [Online].
https://www.arduino.cc/en/Tutorial/WebServer [Accesat 2018 ] , pag. 38
[5] Arduino. SD Library Reference [Online].
https://www.arduino.cc/en/Reference/SD [Accesat 2017 ]
[6] Cytron Technologies, “ MD10C Enhanced 10Amp DC Motor Driver ”. [Online].
http://www.robotshop.com/media/files/PDF/user -manual -md10c -v2.pdf [Accesat 2018]
[7] D-Roboticsonline, “ DFRobot AmbientLight Sensor(DFR0026) ”. [Online].
http://droboticsonline.com/ebaydownloads/Ambient%20Light%20Sensor%20Manual.pdf
[Accesat 2018]
[8] Farnell element14, “ XBee™ Series 2 OEM RF Modules ”. [Online].
http://www.farnell.com/datasheets/27606.pdf [Accesat 2018]
[9] GHI Electronics, “ Songle Relay ”. [Online].
https://www.ghielectronics.com/downloads/man/20084141716341001RelayX1.pdf [Accesat
2018]
[10] JQuery. Ajax API Documentation [Online].
http://api.jquery.com/jquery.ajax/ [Accesat 2018 ]
[11] Mic ropik,” DHT11 Humidity & Temperature Sensor ”. [Online].
http://www.micropik.com/PDF/dht11.pdf [Accesat 2018]

45
[12] Princess Auto, “ 12V DC Linear Actuator Instruction Manual ”. [Online].
http://images11.palcdn.com/hlr -system/Documents/85/850/8507/8507840_Manual.pdf [Accesat
2017]
[13] Sparkfun, “ Temperature Sensor – Waterproof (DS18B20) ”. [Online].
http://cdn.sparkfun.com/datasheets/Sensors/Temp/DS18B20.pdf [Accesat 201 7]
[14] XCTU Configuration & Test Utility Software User Guide. [Online].
https://docs.digi.com/display/XCTU/Download+and+install+XCTU [Accesat 201 7]
[15] XBee Shield Hookup Guide. [Online].
https://learn.sparkfun.com/tutorials/xbee -shield – hookup -guide [Accesat 2018 ]

46
ANEXA 1 Codul sursă placă ARDUINO UNO
//**Libraries
#include "DHT.h" //DHT library
#include <OneWire.h> // ds18b20 library
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

//*************************************CONTROL SYSTEM DEFINITIONS*************** //**
Control System Digital Pin Names

#define dirControl 2 //window direction control
#define winControl 3 //window motor controller on/off
#define fanControl 4 //active high
#define heatControl 5 //active high
#define tempAlarm 7 //active high
#define winSensorOpenSwitch 12 // Low = Open
#define winSensorClosedSwitch 13// Low = Closed
//*************************************SENSOR DEFINITIONS AND SETUP********************
#define DHTPIN 10 //using digital pin 10
#define DSPIN 9 //using digital pin 9
#define LIGHTPIN 2 //using analog pin 2
#define DHTTYPE DHT11 //select model of DHT
//LCD
#define I2C_ADDR 0x27 // << – Add your address here.
#define Rs_pin 0
#define Rw_pin 1
#define En_pin 2
#define BACKLIGHT_PIN 3
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

47
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);
//LCD setup
DHT dht(DHTPIN, DHTTYPE); //creates the dht object
OneWire ds(DSPIN); //onewire bus on PIN 9
//This section of code maps the temperature ranges for the switch case statements and
temp alarm int R0_LOW = -20; //Low value of temp range 0 int R0_HIGH = 15; //high value of te mp
range 0
int R1_LOW = 15; //Low value of temp range 1
int R1_HIGH = 25; //high value of temp range 1
int R2_LOW = 25; //Low value of temp range 2
int R2_HIGH = 30; //high value of temp range 2
int R3_LOW = 30; //Low value of temp range 3
int R3_HIGH = 35; //high value of temp range 3
int range; //variable used for switch case statements
float temp = 0; //temperature value read from sensor
int tempLow; //low threshold temperature for alarm
int tempHigh; //high threshold temperature for alarm
//control buttons from website
int manualOverride = LOW ; //signal coming from web server when user wants to operate
controls manually
int fanButton = HIGH; //web server fan control button
int heatButton = HIGH; //web server heat control button
int openWindowButton = LOW; //web server open window control button int closeWindowButton
= LOW; //web server close window control button
//variables
bool openning = false;
unsigned long timeToStopOpenning = 0;
int mode = 0;
int winCommand = 0;
int lightSensor = 0;
int type = 0;
int windows = 0;
boolean winSensorOpen = false; //Low when open
boolean winSensorClosed = false; //low when closed
const long interval = 2000; //update interval for LCD
unsigned long prevMillis = 0;
//********************END CONTROL SYSTEM DEFINITIONS***************************

48
//**********************CONTROL SYSTEM SETUP************************************* void
setup() {
Serial.begin(9600);
// define inputs and outputs pinMode(winControl, OUTPUT); pinMode(dirControl,
OUTPUT); pinMode(fanCo ntrol, OUTPUT); pinMode(heatControl, OUTPUT); pinMode(winSensorOpenSwitch,
INPUT); pinMode(winSensorClosedSwitch, INPUT);
digitalWrite(fanControl, HIGH);
digitalWrite(heatControl, HIGH);
pinMode(tempAlarm, OUTPUT);
dht.begin();
lcd.begin (20, 4); // << – our LCD is a 20×4
// LCD Backlight ON lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);
lcd.home (); // go home on LCD lcd.print("Greenhouse");
}
//*********************END CONTROL SYSTEM SETUP*************************
//**************** ****CONTROL SYSTEM FUNCTIONS****
//********OPEN WINDOW FUNCTION**************
int openWindow(boolean winSensorOpen) {
while (winSensorOpen == true) { //false when open
digitalWrite(winControl, HIGH);
digitalWrite(dirControl, LOW); //Open
break;
}
if (winSe nsorOpen == false) { //fully open
digitalWrite(winControl, LOW);
}
}
//********END OPEN WINDOW********************
//********CLOSE WINDOW FUNCTION**************
int closeWindow(boolean winSensorClosed) {
while (winSensorClosed == HIGH) { //low when closed
digitalWrite(winControl, HIGH);
digitalWrite(dirControl, HIGH); //Close
Serial.println("Window Closing");
break;
}

49
if (winSensorClosed == LOW) { //fully closed
Serial.println("WIndow is closed");
digitalWrite(winControl, LOW);
}
}
//********END CLOSE WINDO W******************** //***********************AUTOMATIC CONTROL
FUNCTION*************************** int autoControl(boolean winSensorOpen, boolean
winSensorClosed) {
if (temp < R0_HIGH) {
range = 0;
}
else if (temp < R1_HIGH) {
range = 1;
}
else if (temp < R2_HIGH) {
range = 2;
}
else if (temp < R3_HIGH) {
range = 3;
}
switch (range) {
case 0: //Too cold
if (temp < tempLow) { //check if temperature is critcally low
digitalWrite(tempAlarm, HIGH);
}
else {
digitalWrite(tempAlarm, LOW);
}
if (winSensorClosed == true) { //window is open
closeWindow(winSensorClosed);
}
if (winSensorClosed == false) { //window is closed
digitalWrite(winControl, LOW);
}
digitalWrite(fanControl, HIGH);

50
digitalWrite(heatControl, LOW);
break;
case 1: //Just right
if (winSensorClosed == true) { //window is open
closeWindow(winSensorClosed);
}
if (winSensorClosed == false) { //window is closed
digitalWrite(winControl, LOW);
}
digitalWrite(fanControl, HIGH);
digitalWrite(heatControl, HIGH);
break;
case 2: //too warm
if (winSensorOpen == true) { //window is closed
openWindow(winSensorOpen);
}
else if (winSensorOpen == false) { //fully open
digitalWrite(winControl, LOW);
}
//digitalWrite(winControl,LOW);
digitalWrite(fanControl, LOW);
digitalWrite(heatControl, HIGH);
break;
case 3: //too hot
if (winSensorOpen == true) { //window is closed
openWindow(winSensorOpen);
}
else if (winSensorOpen == false) { //fully open
digitalWrite(winControl, LOW);
}
digitalWrite(fanControl, LOW);
digitalWrite(heatControl, HIGH);
break;
}

51
}
//*****************END AUTOMATIC CONTROL***************************
//**************MANUAL CONTROL FUNCTION**************
int manualControl(boolean winSensorOpen, boolean winSensorClosed) { if (heatButton ==
HIGH) {
digitalWrite(heatControl, HIGH);
}
if (fanButton == HIGH) {
digitalWrite(fanControl, HIGH);
}
if (openWindowButton == HIGH) {
openWindow(winSensorOpen);
}
if (closeWindowButton == HIGH) {
closeWindow(winSensorClosed);
}
}
//***********END MANUAL CONTROL********************
//************DS18B20 Digital Temp Sensor**********
//returns the temperature from one DS18S20 in DEG Celsius
float getTemp() {
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
//Serial.println("CRC is not valid!");
return -1000;
}
if ( addr[0] != 0x10 && addr[0] != 0x28) {
//Serial.print("Device is not recognized");
return -1000;

52
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
ds.reset_search();
byte MSB = data[1];
byte LSB = dat a[0];
float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;
return TemperatureSum;
}
//********************END CONTROL SYSTEM FUNCTIONS***************************** void
loop() {
lightSensor = analogRead(LIGHTP IN);
int hum = dht.readHumidity(); //reads humidity
float dhtTemp = dht.readTemperature(); //reads temp in celsius
float tempDS = getTemp();
temp = tempDS;
winSensorOpen = digitalRead(winSensorOpenSwitch);
winSensorClosed = digitalRead(winSensorClosedSwitc h);
unsigned long curMillis = millis();
Serial.println(lightSensor);
Serial.println(lightSensor * 100 / 1023);
int lightMapped = map(lightSensor, 0, 1023, 0, 100);
Serial.println("101");
Serial.println(tempDS);
Serial.println("102");
Serial.println(hum);
Serial.println("103");

53
Serial.println(lightMapped);
Serial.println("104");
if (winSensorOpen == true) {
Serial.println(1); //window is open
}
else if (winSensorClosed == false) {
Serial.println(2); //window is closed
}
else {
Serial.println(3); //window is moving
}
Serial.println("105");
if (mode == 1) {
Serial.println(1);//manual mode selected
}
else if (mode == 0) {
Serial.println(0); //auto mode selected
}
//Controls from Xbee via Web server
if (Serial.available()) {
type = Serial.parseInt();
if (type == 104) { //Open Window Command from Xbee
winCommand = 1;
Serial.println("Window open");
}
if (type == 105) { //Close Window Command from Xbee
winCommand = 0;
Serial.println("Window close");
}
if (type == 106) {
mode = 1; //Manual Mode
}
if (type == 107) {
mode = 0; //Auto Mode

54
}
}
if (mode == 1) {
manualOverride = HIGH;
Serial.println("Manual Mode");
}
if (mode == 0) {
manualOverride = LOW;
Serial.println("Auto Mode");
}
if (winCommand == 1) {
openWindowButton = HIGH; //Call the open function
closeWindowBut ton = LOW;
}
if (winCommand == 0) {
closeWindowButton = HIGH;//call the close function
openWindowButton = LOW;
}
//LCD Printing
if (curMillis – prevMillis >= interval) { //updates every 2 seconds prevMillis =
curMillis;
lcd.setCursor (0, 1); // go to start of 2nd line
lcd.print("Temp: ");
lcd.print(temp);
lcd.print(" C");
lcd.setCursor (0, 2); // go to start of 4th line
lcd.print("Humidity: ");
lcd.print(hum);
lcd.print(" %");
lcd.setCursor(0, 3);
lcd.print("Light: ");
lcd.print(light Mapped);
lcd.print(" %");
}
//Manual or Auto Mode

55
if (manualOverride == HIGH) {
manualControl(winSensorOpen, winSensorClosed);
}
else if (manualOverride == LOW) {
autoControl(winSensorOpen, winSensorClosed);
}
}x

56
ANEXA 2 Codul sursă placă ARDUINO ATMEGA2560
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <Client.h>
// size of buffer used to capture HTTP requests #define REQ_BUF_SZ 25
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
//byte mac[] = {0x34, 0x17, 0xEB, 0xC7, 0xF5, 0x1F};
byte mac[] = {0xB8, 0xCA, 0x3A, 0xB4, 0xD7, 0x0A};
#define __USE_DHCP__
IPAddress ip(192, 168, 0, 107);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
// fill in your Domain Name Server address here: IPAddress myDns(8, 8, 8, 8); //
google puble dns
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
File webFile;
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated
string
char req_index = 0; // index into HTTP_req buffer
float temp = 0;
float humi = 0;
int mode = 0; //0 – auto, 1 – manual
int window = 0;
int fan = 0; //0 – off, 1 – on
int type;
int heat = 0; //0 – off, 1 – on
int winstatus = 0;
float light = 0;
char password[REQ_BUF_SZ – 14] = {0};

57
//Delay variables
unsigned long previousMillis = 0;
unsigned long readMillis = 0;
const long inter val = 10000;
/************************************************
* setup *
************************************************/
void setup() {
// Open serial communications and wait for port to open: Serial.begin(9600);
Serial1.begin(9600);
// ******** initiali ze SD card ********
Serial.println("Initializing SD card…"); if (!SD.begin(4)) {
Serial.println("ERROR – SD card initialization failed!");
return; // init failed
}
Serial.println("SUCCESS – SD card initialized.");
// check for index.htm file
if (!SD.exists("pass.htm")) {
Serial.println("ERROR – Can't find pass.htm file!");
return; // can't find index file
}
if (!SD.exists("password.txt")) {
Serial.println("ERROR – Can't find password.txt file!");
return; // can't find index file
}
if (!SD.exists("ind ex.htm")) {
Serial.println("ERROR – Can't find index.htm file!");
return; // can't find index file
}
Serial.println("SUCCESS – Found index.htm file.");
Serial.println("SUCCESS – Found pass.htm file.");
Serial.println("SUCCESS – Found password.txt file.");
// ******** initialize the ethernet device ********
#if defined __USE_DHCP__ Ethernet.begin(mac);

58
#else
Ethernet.begin(mac, ip, myDns, gateway, subnet); #endif
// start the Ethernet connection and the server: server.begin();
Serial.print("server is at "); Serial.println(Ethernet.localIP());
#if defined __USE_DHCP__
ip = Ethernet.localIP();
#endif
int i = 0;
File passFile = SD.open("password.txt");
while (passFile.available()) {
password[i] = passFile.read();
i++;
}
webFile.close();
Serial.print("Password is: ");
Serial.println(password);
}
/************************************************
* loop *
************************************************/
void loop() {
//datalogging variables
unsigned long currentMillis = millis(); //used for delays throughout the code int
sensors[3]; //array that holds the sensor data received from the xbee
String currentTime = "1/15/2016 10:51,"; //temporary place holder for current time, will
be later pulled from NTP
if (Serial1.available())
{
type = (Serial1.parseInt());
if (type == 101) {
temp = (Serial1.parseFloat());
}
if (type == 102) {
humi = (Serial1.parseFloat());
} if (type == 103) {

59
light = (Serial1.parseFloat());
}
if (type == 104) {
}
if (type == 105) {
}
}
if (winstatus == 1) {
Serial1.println(104); //Open
}
if (winstatus == 0) {
Serial1.println(105); //Close
}
if (mode == 1) {
Serial1.println(106); // mode=1 is manual
}
if (mode == 0) {
Serial1.println(107); // mode=0 is auto
}
//Put sensor data into an arraqy for datalogging
sensors[0] = (int)light;
sensors[1] = (int)humi;
sensors[2] = (int)temp;
// make a string for assembling the data to log: String dataString = "";
dataString += currentTime; //Time stamp the data
// Add sensor data to 1 String//
dataString = sensorsToString(sensors, dataString);
//Call Write Fcn with a delay
if (currentMillis – previousMillis >= interval) {
previousMillis = currentMillis;
sdWrite(dataString);
}
// listen for incoming clients EthernetClient client = server.available(); if
(client) {
//Serial.println("new client");

60
// an http request ends with a blank line boolean currentLineIsBlank = true; while
(client.connected())
{
if (client.available()) { // client data available to read char c = client.read(); //
read 1 byte (character) from client
// buffer first part of HTTP request in HTTP_req array (string)
// leave last element in array as 0 to null terminate string (REQ_BUF_SZ – 1)
if (req_index < (REQ_BUF_SZ – 1)) {
HTTP_req[req_index] = c; // save HTTP request character
req_index++;
}
// print HTTP request character to serial moni tor //Serial.print(c);
// last line of client request is blank and ends with \n
// respond to client only after last line received
if (c == ' \n' && currentLineIsBlank) {
// open requested web page file
if (StrContains(HTTP_req, "GET / HTTP/1", 0)) {
client.println("HTTP/1.1 200 OK");
client.println("Content -Type: text/html");
client.println("Connnection: close");
client.println();
webFile = SD.open("pass.htm"); // open password web page file
}
else if (StrContains(HTTP_req, "GET /password", 0)) {
if (StrContains(HTTP_req, password, 13)) {
client.println("interface");
}
else {
client.println("");
}
}
else if (StrContains(HTTP_req, "GET /interface", 0)) {
client.println("HTTP/1.1 200 OK");
client.println("Content -Type: text/html");
client.println("Connne ction: close");

61
client.println();
webFile = SD.open("index.htm");
// open web page file
}
else if (StrContains(HTTP_req, "GET /para", 0)) {
if (!(temp < 100) && (temp > -50)) temp = -99;
if (!(humi < 100) && (humi > 0)) humi = -99;
if (!(light < 1000) && ( light > 0)) light = -99;
sendHeader_text(client);
String paraString = String(temp) + " " + String(humi) + " " + String(light) + " " +
String(mode) + " " + String(winstatus) +
" " + String(fan) + " " + String(heat); client.println(paraString);
}
else if (St rContains(HTTP_req, "GET /Auto", 0)) {
mode = 0;
Serial.println("Auto mode");
if (client.connected())
{
sendHeader_text(client);
client.println(mode);
}
}
else if (StrContains(HTTP_req, "GET /Manual", 0)) {
mode = 1;
Serial.println("Manual mode");
if (client.connected())
{
sendHeader_text(client);
client.println(mode);
}
}
else if (StrContains(HTTP_req, "GET /openWin", 0)) {
winstatus = 1;
Serial.println("Window open");
if (client.connected())

62
{
sendHeader_text(client);
client.println(window);
}
}
else if (StrContains(HTTP_req, "GET /closeWin", 0)) {
winstatus = 0;
Serial.println("Window close");
if (client.connected())
{
sendHeader_text(client);
client.println(window);
}
}
else if (StrContains(HTTP_req, "GET /fanOn", 0)) {
if (client.connected())
{
sendHeader_text(client);
client.println(fan);
}
}
else if (StrContains(HTTP_req, "GET /fanOff", 0)) {
if (client.connected())
{
sendHeader_text(client);
client.println(fan);
}
}
else if (StrContains(HTTP_req, "GET /heatOn", 0)) {
if (client.connected())
{
sendHeader_text(client);
client.println(heat);
}

63
}
else if (StrContains(HTTP_req, "GET /heatOff", 0)) {
if (client.connected())
{
sendHeader_text(client);
client.println(heat);
}
}
if (webFile) {
while (webFile.available()) {
client.write(webFile.read()); // send web page to client
}
webFile.close();
client.stop();
}
// reset buffer index and all buffer elements to 0 req_index = 0;
StrClear(HTTP_req, REQ_BUF_SZ); break;
}
// every line of text received from the client ends with \r\n if (c == ' \n') {
// last character on line of received text
// starting new line with next character read currentLineIsBlank = true;
}
else if (c != ' \r') {
// a text character was received from client currentLineIsBlank = false;
}
} // end if (client.available())
} // end while (client.connected())
// give the web browser time to receive the data
// close the connection:
client.stop();
//Serial.println("client disconnected");
}
}
void sendHeader_text(EthernetClient client) {

64
client.println("HTTP/1.1 200 OK");
client.println ("text/plain; charset=us -ascii");
client.println("Connnection: close");
client.println();
}
/************************************************
* string processing functions *
************************************************/
// sets every element of str to 0 (clears array) void StrClear(char *str, char
length)
{
for (int i = 0; i < length; i++) { str[i] = 0;
}
}
// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *s find, int start)
{
char found = 0;
char index = start;
char len;
len = strlen(str);
if (strlen(sfind) > len) {
return 0;
}
while (index < len) {
if (str[index] == sfind[found]) {
found++;
if (strlen(sfind) == found) {
return 1;
}
}
else {
found = 0;

65
}
index++;
}
return 0;
}
//Write to SD Card
void sdWrite(String inputString) {
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// Write Function
// if the file is available, write to it: if (dataFile) {
dataFile.println();
dataFile.print(inputString);
// this prints three sensor values separated by commas(###,###,###) (csv format)
dataFile.close();
}
// if the file isn't open, pop up an error: else {
Serial.println("error opening datalog.txt");
}
}
// read 3 sensors and add it to dataString//
String senso rsToString(int sensorArray[], String dString) {
for (int i = 0; i < 3; i++) {
int sensor = sensorArray[i];
dString += String(sensor);
if (i < 2) {
dString += ",";
}
}
return dString;
}

66
ANEXA 3 Codul sursă Interfață WEB
<!doctype html>
<html lang="en">
<head>
<meta charset="utf -8">
<title>Greenhouse Web Interface</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
</head>
<body>
<h1>Greenhouse Web Interface</h1>
<p id="tempNum"> temperature = </p>
<p id="humiNum"> humidity = </p>
<p id="lightNum"> light intensity = </p>
<p id="controlMode">Current Control Mode: Manual</p>
<button type="button" onclick=" controlModeButtonClicked()" id="controlModeButton">Switch
to Auto</button></br></br></br>
<p id="windowStat">window status:closed</p>
<button type="button" onclick="windowButtonClicked()" id="windowButton">open
window</button></br>
<p id="fanStat">fan stat us:off</p>
<button type="button" onclick="fanButtonClicked()" id="fanButton">turn on
fan</button></br>
<p id="heatStat">heat status:off</p>
<button type="button" onclick="heatButtonClicked()" id="heatButton">turn on
heat</button></br>
<div id="chart_div">< /div>
<a href="http://www.accuweather.com/en/ca/winnipeg/r3b/current -weather/48989" class="aw –
widget-legal"></a><div id="awtd1452073385725" class="aw -widget-36hour" data -locationkey="48989"
data-unit="c" data -language="en -us" data -useip="false" data -uid="awtd1452073385725" data –
editlocation="false"></div>
<script type="text/javascript" src="http://oap.accuweather.com/launch.js"></script>
<script>
google.charts.load('current', {packages: ['corechart', 'line']});
var timeInterval = 5; //update parameters ever y x seconds
var time = 0;
var array = [];
var temp = 0.0;

67
var humi = 0;
var light = 0;
setInterval(function() {
var setStatus = function(data) {
if (data.localeCompare("updating") == 0) {
document.getElementById("tempNum").innerHTML = "temperature = " + da ta;
document.getElementById("humiNum").innerHTML = "humidity = " + data;
document.getElementById("lightNum").innerHTML = "light intensity = " + data;
}
else {
var para = data.split(" ");
if (parseInt(para[0]) != -99) document.getElementById("tempNum").innerHTML =
"temperature = " + para[0] + "șC";
if (parseInt(para[1]) != -99) document.getElementById("humiNum").innerHTML =
"humidity = " + para[1];
if (parseInt(para[2]) != -99) document.getElementById("lightNum").innerH TML = "light
= " + para[2];
if (parseInt(para[3]) == 0) {
document.getElementById("controlMode").innerHTML = "Current Control
Mode: Auto";
document.getElementById("controlModeButton").firstChild.data = "Switch to
Manual";
}
else if (parseInt(para[3]) == 1) {
document.getElementById("controlMode").innerHTML = "Current Control
Mode: Manual";
document.getElementById("controlModeButton").firstChild.data = "Switch to
Auto";
}
if (parseInt(para[4]) == 0) {
document.getElementById("windowStat").innerHTML = "window
status:closed";
document.getElementById("windowButton").firstChild.data = "open window";
}

68
else if (parseInt(para[4]) == 1) {
document.getlementById("windowStat").innerHTML = "window
status:open";
document.getElementById("windowButton").firstChild.data = "close window";
}
if (parseInt(para[5]) == 0) {
document.getElementById("fanStat").innerHTML = "fan status:off";
document.getElementById("fanButton").firstChild.data = "turn on fan";
}
else if (parseInt(para[5]) == 1) {
document.getElementById ("fanStat").innerHTML = "fan status:on";
document.getElementById("fanButton").firstChild.data = "turn off fan";
}
if (parseInt(para[6]) == 0) {
document.getElementById("heatStat").innerHTML = "heat status:off";
document.getElementById("heatButton").firstCh ild.data = "turn on heat";
}
else if (parseInt(para[6]) == 1) {
document.getElementById("heatStat").innerHTML = "heat status:on";
document.getElementById("heatButton").firstChild.data = "turn off heat";
}
if(!isNaN(parseFloat(para[0]))) temp = parseFloat(p ara[0]);
array.push([time, temp]);
if(array.length > 20)
array.shift();
drawBasic(array);
time += timeInterval;
}
}
$('#my_div').sendRq("para", setStatus);
}, timeInterval*1000);
(function( $ ){
$.fn.sendRq = function(rq, func) {
$.ajax(rq).done(function( data ) {func(data);}).fail(function() {func("updating");});
return this;

69
};
})( jQuery );
function reservedForLater(data) {
}
function controlModeButtonClicked() {
if (document.getElementById("controlModeButton").firstChild.data.localeCompare("Switch to
Auto") == 0)
{
$('#my_div').sendRq("Auto", reservedForLater(1));
}
else {
$('#my_div').sendRq("Manual", reservedForLater(1));
}
}
function windowButtonClicked() {
if (document.getElementById("windowButton").firstChild.data.localeCompare("press to
open") == 0 ) { $('#my_div').sendRq("windowOpen", reservedForLater(1));
}
else {
$('#my_div').sendRq("windowClose", reservedForLater(1));
}
}
function fanButtonClicked() {
if (document.getElementById("fanButton").firstChild.data.localeCompare("turn on") == 0) {
$('#my_div').sendRq("fanOn", reservedForLater(1));
}
else {
$('#my_div').sendRq("fanOff", reservedForLater(1));
}
}
function heatButtonClicked() {
if (document.getElementById("heatButton").firstChild.data.localeCompare("turn on") == 0)
{ $('#my_div').sendRq("heatOn", reservedForLater(1));
}
else {
$('#my_div').sendRq("heatOff", reservedForLater(1));

70
}
}
function drawBasic() {
var data = new google.visualization.DataTable();
data.addColumn('number', 'seconds');
data.addColumn('number', '°C' );
data.addRows(array);
var options = {
hAxis: {
title: 'Time'
},
vAxis: {
title: 'Temperature'
}
};
var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(data, options);
</script>
</body>
</html>

71
ANEXA 4 Codul sursă Logare Website
<!DOCTYPE html>
<html>
<body onload="passPrompt()">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<link rel="stylesheet"
href="https://ajax.googleapis.com/ajax/libs/jquerymobile/ 1.4.5/jquery.mobile.min.css"> <script
src="https://ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.js"></script>
<script>
function passPrompt() {
var pass = prompt("To access greenhouse web interface, please enter password and press
OK:"); if (pass != null) {
$('#my_div').sendRq("password_" + pass);
}
}
(function( $ ){
$.fn.sendRq = function(rq) {
$.ajax(rq).done(function(data){location.replace(data);});
return this;
};
})( jQuery );
</script>
</body>
</html>

Similar Posts