Realizarea unui sistem de achiziție de date și de [618076]
Universitatea “Politehnica ” din București
Facultatea de Electronică, Telecomunicații și Tehnologia Informației
Realizarea unui sistem de achiziție de date și de
control al echipamentelor auxiliare unei locuințe
PROIECT DE DIPLOMĂ
prezentat ca cerință parțială pentru obținerea titlului de
Inginer în domeniul Electronică și Telecomunicații
programul de studii de licență Tehnologii și Sisteme de Telecomunicații
Conducători științifici Absolvent: [anonimizat]. Alexandru TATOMIRESCU Ioan BAICU
Prof. dr . ing. Mihnea UDREA
2018
Cuprins
Lista figurilor ………………………….. ………………………….. ………………………….. ………………………….. ………… 9
Lista tabelelor ………………………….. ………………………….. ………………………….. ………………………….. ………. 11
Lista acronimelor ………………………….. ………………………….. ………………………….. ………………………….. …. 13
Introducere ………………………….. ………………………….. ………………………….. ………………………….. ………….. 15
Capitolul 1 – Conceptul de Locuință Inteligentă ………………………….. ………………………….. ………………… 17
1.1 Definire ………………………….. ………………………….. ………………………….. ………………………….. ………. 17
1.2 IoT (Internet of Things) ………………………….. ………………………….. ………………………….. …………….. 18
Capitolul 2 – Rețele de senzori fără fir ………………………….. ………………………….. ………………………….. …. 23
2.1 Definire ………………………….. ………………………….. ………………………….. ………………………….. ………. 23
2.2 To pologii de rețele ………………………….. ………………………….. ………………………….. ……………………. 25
2.2 Standarde folosite ………………………….. ………………………….. ………………………….. …………………….. 25
2.3 Constrângeri impuse de rețelele de senzori fără fir ………………………….. ………………………….. ……. 26
Capitolul 3 – Resurse Folosite ………………………….. ………………………….. ………………………….. …………….. 29
3.1 Resurse Hardware ………………………….. ………………………….. ………………………….. …………………….. 29
3.1.1 Modulul de procesare ………………………….. ………………………….. ………………………….. …………. 30
3.1.2 Senzorii de temperatură și de umiditate ………………………….. ………………………….. ……………… 33
3.1.3 Modulul de comunicație ………………………….. ………………………….. ………………………….. ……… 35
3.2 Resurse Software Folosite ………………………….. ………………………….. ………………………….. …………. 46
3.2.1 Arduino IDE ………………………….. ………………………….. ………………………….. ……………………… 46
3.2.2 Sistemul de operare Raspbian ………………………….. ………………………….. ………………………….. . 47
3.2.3 Conexiunea cu Raspberry PI ………………………….. ………………………….. ………………………….. .. 47
3.2.4 Serverul Apache ………………………….. ………………………….. ………………………….. …………………. 49
3.2.5 Limbaje folosite ………………………….. ………………………….. ………………………….. …………………. 49
Capitolul 4 – Realizarea practică ………………………….. ………………………….. ………………………….. …………. 51
4.1 Proiectarea rețelei de comunicație fără fir ………………………….. ………………………….. ………………… 51
4.2 Realizarea comunicației între no durile rețelei ………………………….. ………………………….. …………… 53
4.2.1 Nodul senzor ………………………….. ………………………….. ………………………….. ……………………… 56
4.2.2 Nodul de control ………………………….. ………………………….. ………………………….. ………………… 59
4.2.3 Nodul principal ………………………….. ………………………….. ………………………….. ………………….. 61
4.3 Alegerea canalului de comunicare ………………………….. ………………………….. ………………………….. 68
Concluzii și contribuția personală ………………………….. ………………………….. ………………………….. ……….. 71
Bibliografie ………………………….. ………………………….. ………………………….. ………………………….. …………. 73
Anexă ………………………….. ………………………….. ………………………….. ………………………….. …………………. 75
Anexa 1 – Programele de pe nodurile rețelei ………………………….. ………………………….. …………………. 75
Anexa 2 – Codul interfeței grafice ………………………….. ………………………….. ………………………….. ……. 79
Lista figurilor
Figura 1. 1 – Arhitectura generală IoT ………………………….. ………………………….. ………………………….. …. 19
Figura 1. 2 – Arhitectură sistem IoT centralizată ………………………….. ………………………….. ……………….. 20
Figura 1. 3 – Arhitectură centralizată de senzori (3) ………………………….. ………………………….. …………… 20
Figura 2. 1 – Structura unui nod al rețelei fără fir ………………………….. ………………………….. ………………. 24
Figura 2. 2 – Rețea de senzori fără fir ………………………….. ………………………….. ………………………….. ….. 24
Figura 2. 3 – Topologie de rețea cu mai multe hop -uri și cu un singur hop ………………………….. ……….. 26
Figura 3. 1 – Caracteristici ale microcontrolerelor ………………………….. ………………………….. …………….. 30
Figura 3. 2 – Arduino UNO ………………………….. ………………………….. ………………………….. ……………….. 31
Figura 3. 3 – Raspberry PI Zero W ………………………….. ………………………….. ………………………….. ……… 32
Figura 3. 4 – Senzor DHT11 ………………………….. ………………………….. ………………………….. ………………. 33
Figura 3. 5 – AM2320 ………………………….. ………………………….. ………………………….. ……………………….. 34
Figura 3. 6 – Modul radio nRF24L01+ ………………………….. ………………………….. ………………………….. … 35
Figura 3. 7 – Comunicație SPI Master -Slave ………………………….. ………………………….. …………………….. 36
Figura 3. 8 – Comunicație Master – Multi -Slave ………………………….. ………………………….. ……………….. 36
Figura 3. 9 – SPI folosind regiștrii de shiftare ………………………….. ………………………….. …………………… 37
Figura 3. 10 – Citirea și scrierea datelor prin SPI (12) ………………………….. ………………………….. ……….. 37
Figura 3. 11 – Principiul de funcționare ESB ………………………….. ………………………….. ……………………. 41
Figura 3. 12 – Procedeul de comunicare ESB ………………………….. ………………………….. …………………… 42
Figura 3. 13 – Formatul pachetului ESB ………………………….. ………………………….. ………………………….. . 42
Figura 3. 14 – Formatul câmpului de control ………………………….. ………………………….. …………………….. 43
Figura 3. 15 – Modelul Multiciver ………………………….. ………………………….. ………………………….. ………. 45
Figura 3. 16 – PuTTY …………………………………………………………………………………………………………….. ……..48
Figura 3. 17 – VNC Viewer ………………………….. ………………………….. ………………………….. ……………….. 48
Figura 4. 1 – Arhitectura generală a sistemului realizat ………………………….. ………………………….. …….. 51
Figura 4. 2 – Macheta experimentală ………………………….. ………………………….. ………………………….. …… 52
Figura 4. 3 – Conexiune Arduino Nano – nRF24L01+ ………………………….. ………………………….. ……….. 56
Figura 4. 4 – Structura programului de pe nodul cu senzor ………………………….. ………………………….. …. 58
Figura 4. 5 – Structura nodului principal ………………………….. ………………………….. ………………………….. 59
Figura 4. 6 – Structura programului de pe nodul de control ………………………….. ………………………….. … 60
Figura 4. 7 – Conexiune Raspberry PI – nRF24L01+ ………………………….. ………………………….. ………… 61
Figura 4. 8 – Nivelurile nodului principal ………………………….. ………………………….. …………………………. 61
Figura 4. 9 – Detalii de conexiune ………………………….. ………………………….. ………………………….. ………. 62
Figura 4. 10 – Principiul de funcționare al nodului principal ………………………….. ………………………….. . 64
Figura 4. 11 – Interfața grafică ………………………….. ………………………….. ………………………….. ……………. 66
Figura 4. 12 – Algoritm ale gere canal de comunicație ………………………….. ………………………….. ……….. 68
Figura 4. 13 – Rezultatul rulării programului de scanare ………………………….. ………………………….. ……. 69
Figura 4. 14 – Numărul de purtătoare în tr-un interval de timp pe un anumit canal …………………………. 70
Lista tabelelor
Tabel 3.1 – Setarea puterii amplificatorului de semnal ………………………….. ………………………….. ………. 38
Tabel 3.2 – Modurile de funționare ale integratului ………………………….. ………………………….. …………… 40
Tabel 4. 1 – Niveluri de amplificare ………………………….. ………………………….. ………………………….. ……. 54
Tabel 4 . 2 – Conectarea pinilor Arduino Nano – nRF24L01+ ………………………….. …………………………. 56
Tabel 4. 3 – Conectarea pinilor pentru DHT11 și AM2320 ………………………….. ………………………….. … 57
Lista acronimelor
ACK – Acknowledgement
ADC – Analog to Digital Converter
ARM – Advanced RISC Machine
CRC – Cyclic Redundancy Check
CSN – Chip Select Not
DAC – Digital to Analog Converter
ESB – Enhanced ShockBrust
FSK – Frequency -Shift Keying
GFSK – Gaussian Frequency -Shift Keying
GFSK – Gaussian Frequency -Shift Keying
GPIO – General Pin Input/Output
GUI – Graphical User Interface
HDMI – High -Definition Multimedia Interface
HTTP – Hypertext Transfer Protocol
I2C – Inter -Integrated Circuit
IoT – Internet of Things
IP – Internet Protocol
ISM – Industrial, Scientific and Medical
MISO – Master In Slave Out
MOSI – Master Out Slave In
PID – Packet Identifier
PWM – Pulse -Width Modulation
RAM – Random Access Memory
ROM – Read -Only Memory
RPI – Raspberr y PI
SCK – Serial Clock
SOC – System on a chip
SPI – Serial Peripheral Interface
SS – Slave Select
SSH – Secure Shell
UC – Microcontreller
UP – Microprocesor
WSN – Wireless Sensor Network
15
Introducere
Comun icațiile fără fir se dezvoltă rapid, făcând posibilă crearea unor sisteme de rețele care pot colecta,
analiza, evalua și valida în mod constant mediul înconjurător pentru a obține mai mult control asupra
factorilor ce ne interesează.
În această lucrare se va evidenția modul de realizare al unui sistem de achiziție de date și de control al
echipamentelor auxiliare unei locuințe. Acest proiect are la bază o rețea cu comunicație radio folosind
integratul nRF24L01+.
Sistemul este ieftin și scalabil atât în ceea ce privește tipul de senzori , cât și numărul de noduri, ceea ce
îl face bine adaptat pentru o mare varietate de aplicații legate de monitorizarea mediului. Spre deosebire
de modelele rețelelor cu fir, modelele de rețele fără fir oferă o mai mare flex ibilitate în abordarea acestor
probleme de mediu. Din acest motiv, este implementat un sistem ce are la bază o rețea de senzori fără fir
care poate face față acestei situații.
Pe lângă achiziția de date din mediul exterior și comandarea unor circuite cu s copul de a controla
echipamentele electronice auxiliare unei locuințe se va realiza și o interfaț ă grafică, cu ajutorul căreia se
va realizea o conexiune mai facilă cu utilizatorul.
Prin intermediul interfeței grafice se vor putea monitoriza date precum t emperatura, umiditatea și se vor
putea trimite anumite comenzi atât local, la nivelul nodului central, cât și către noduri de rețea destinate
controlului.
Acest proiect are la bază o rețea de noduri interconectate cu un nod principal la nivelul căruia se vor
centraliza datele primite de la celelalte noduri ale rețelei. Tot la nivelul acestui nod se vor realiza și
comenzile de control care pot fi adresate în timp real de către un utilizator.
Primul capitol prezintă conceptele de IoT și Smart Home în sens l arg, precum și funcționalitatea și
integrarea lor în contextul rețelelor actuale. Al doilea capitol evidențiază topologiile de rețea ce pot fi
abordate în astfel de aplicații, standardele folosite în comunicațiile fără fir și constrângerile impuse de
astfe l de sisteme. În al treilea capitolul se vor prezenta atât echipamentele fizice , cât și resursele software
folosite la realizarea acestei lucrări . Capitolul patru oferă detalii cu privire la etapele urmărite în
dezvoltarea proiectului , precum proiectarea r ețelei, realizarea comunicației sau a legerea canalului de
comunicație .
16
17
Capitolul 1 – Conceptul de Locuință Inteligentă
O locuință inteligentă este un concept ce se referă la un spațiu fie el locuință, birou sau casă de vacanță
ce dispune de tehnologii moderne care asigură automatizarea sistemelor și a echipamentelor electronice
aflate în aceasta. O astfel de locuință va asigura confort, securitate, siguranță și economie energetică.
În ultima vreme se investesc foarte mu lte resurse în dezvoltarea de si steme care să permită controlul
tuturor echipamentelor electronice auxiliare unei locuințe, chiar și de la distanță, prin intermediul
Internetului. Multe studii demonstrează că o astfel de locuință, pe lângă faptul că oferă un plus de confort
locuitorilor, asigură un consum mult mai redus de energie în comparație cu locuințele clasice.
O locuință nu este inteligentă prin modul de construire eficient sau prin modul de compartimentare, ci
prin diferite caracteristici precum te hnologiile interactive pe care le pune la dispoziție, precum iluminatul
în funcție de gradul de luminozitate din locuință, încălzirea eficientă bazată pe temperatura ambientală
aleasă de locatari, securitatea sporită, perdele care se deschid și se restrâng la dorința locatarilor și multe
altele.
Locația dispozitivelor inteligente dintr -o locuință trebuie să fie adaptată la configurația fizică a acesteia,
însă aceasta nu este singura problemă. Există de asemenea problema modului de interacțiune între
echipam entele interactive întrucât modul de com unicare între echipamente diferă de la un sistem la altul
deoarece rețeaua care stă la baza fiecăruia este unică.
În cadrul acestui capitol se va defini conceptul de locuință Inteligentă și se va face introducerea în
conceptul de Internet of Things (IoT) .
1.1 Definire
Locuințele inteligente mai sunt cunoscute ș i sub denumirea de locuințe automatizate, acestea au în
componența lor diverse dispozitive care controlează caracteristicile locuinței. Inițial acestea au avu t ca
principal scop controlul comportamentelor unor si steme precum sistemul de încălzire, dar în ultima
vreme tehnologia a evoluat foarte mult astfel că orice echipament electronic din casă poate fi inclus în
acest sistem. În plus locuința inteligentă nu d oar controlează prin pornirea și oprirea echipamentelor din
aceasta ci poate real iza și o monitorizare a activită ții locatarilor și adaptarea condiții lor mediului ambiant
la necesităț ile acestora sau realizarea de acțiuni după cum cere utilizator ul.
Numer oase studii au demonstrat că în cazul locuințelor inteligente consumul de energie este mai redus
decât în cazul locuințelor clasice. Acestea oferă un consum redus de energie întrucât echipamentele
auxiliare locuinței sunt c ontrolate într-un mod continu u și automatizat în funcție de nevoile locatari lor.
18
1.2 IoT (Internet of Things)
Internetul obiectelor (Internet of Things) denumește o rețea de obiecte fizice „inteligente”, interconectate,
care au implementată tehnologia necesară pentru a fi capabile s ă sesizeze și să comunice date despre
starea lor, precum și de a interacționa cu mediul exterior.
Explozia IoT actuală are potențialul de a schimba substanțial activitatea industrială, mediul și modul în
care oamenii vor lucra și trăi. (1) Unele estimă ri preconizează ca până în anul 2020 numărul de obiecte
inteligente i nterconectate va tinde spre numă rul de circa 200 de miliarde , de la telefoanele mobile, tablete,
televizoare și alte obiecte electrocasnice, la dispozitive ce sunt capabile să monitorizeze și să transmită
parametrii de sănătate și de mobilitate a i oamenilor sau animalelor, de calitatea apei sau a aerului,
domeniul putând să se extindă până la dispozitive și elemente de monitorizare și control al parametrilor
unor ech ipamente industriale complexe sau al produselor aflate în containere pentru livrare etc. (2)
Având în vedere potențialul impresiona nt de utilizare practică a soluțiilor dezvoltate în baza acestui
concept constată m că prioritatea ce i se acordă în ultima perioadă este puternic motivată.
Totodată acest concept aduce o serie de schimbă ri în viziunea tehnologică precum:
• Necesitatea extinderii obiectelor inteligente prin standardizarea a noi soluții de comunicație;
• Punerea în valoare a datelor privind evoluțiile stărilor acestor obiecte prin centralizarea lor pe
diferite infrastructuri.
Punerea în valoare a datelor este realizată prin achiziția, stocarea și transmiterea acestora în infrastructuri
centralizate precum și realizarea de ana lize mai amănunțite a acestora folosindu -se unele sisteme
specializate. Această anal iză se face în special pentru a extrage și pentru a sintetiza informația relevantă.
În ultima vreme s -au dezvoltat foarte multe soluții de interconectare a obiectelor intel igente și s -a ajuns
la dezvoltarea unor concepte precum orașe inteligente, case inteligente, sisteme de monitorizare a
gradului de poluare etc.
În ur ma unei analize s -a constatat că principalele funcționalităț i oferite de conceptul IoT pot fi grupate
în cinci catego rii:
• Achiziționarea și prelucrarea datelor;
• Conectivitatea și protocoalele de comunicație;
• Serviciile de monitorizare;
• Autorizarea și autentificarea;
• Analiza datelor și procesarea acestora și asigurarea unei interfețe cu utilizatorul pentru acce s la
funcționalităț ile sistemului.
Arhitectura generală a conceptului IoT este î mpărțită în patru niveluri principale ce sunt figurate în
imaginea de mai jos.
19
Figura 1. 1 – Arhitectura generală IoT
• Nivelul de achiziție
La acest nive l întâlnim diferite tipuri de sen zori precum : RFID, de temperatură , de umiditate sau orice
alt tip de senzori. Principalul scop al acestui nivel este de a identifica în mod unic obiectele și de a
colabo ra cu ele în vederea achiziționă rii de date din mediul exterior prin intermediul unor senzori.
La baza acestui nivel, de cele mai multe ori, stau rețelele de senzori care sunt capabile să achiziționeze
date din mediul exterior pe o suprafață extinsă, în funcție de topologia rețelei și de tipul sistemului
respectiv.
• Nivelul de rețea
Scopul acestui nivel este de a transmite datele obț inute la nivelul de achiziție că tre orice sistem de
procesare a informației prin intermediul rețelelor de comunicație existente precum Internetul, rețeaua de
telefonie mobilă sau o ricare rețea de încredere.
• Nivelul de procesare ș i de legătură
Acest nivel constă în sisteme de procesare a informațiilor care sunt capabile să ia măsuri automate bazate
pe datele r ezultate în urma unei procesări și asigură legă tura sistemului cu baza de d ate în care sunt
stocate datele.
• Nivelul de aplicație
La acest nivel sunt realizate aplic ațiile de IoT bazate pe necesită țile fiecărei industrii în parte precum
casele inteligente sau orașele inteligente.
Cele mai întâlnite tehnologii care sunt implicate în acest concept sunt rețelele d e senzori fără fir,
dispozitivele cu microprocesor încorporat și protocoalele de comunicație.
Una dintre arhitecturile propuse de conceptul IoT este cea centralizată ilustrată și în imaginea de mai jos
și are la bază o infra structură locală independentă. O astfel de soluție este relevantă în situația î n care se
dorește automatizarea unei locuințe.
20
Figura 1. 2 – Arhitectură sistem IoT centralizată
La nivelul unei locuție această implementare poate fi rea lizată folosindu -se o rețea locală de senzori care
respectă arhitectura centralizată ca și în imaginea de mai jos.
Figura 1. 3 – Arhitectură centralizată de senzori (3)
21
Așa cum se poate vedea în imaginea1.3 , în locuință este implementată o rețea wireless de senzori. Având
arhitectură centralizată local, datele se vor centraliza la nivelul nodului principal notat 00 ce coordonează
întreaga rețea. La nivelul său se centralizează datele primite de la restul nod urilor urmând să fie distribuite
către o interfață independentă la care utilizatorul să aibă acces. Pentru a respecta arhitectura vom
presupune că nodul principal 00 es te de fapt un gateway capabil să găzduiască un server. În situația în
care utilizatorul dorește să aplice o constrâ ngere sistemului poate să facă asta prin int ermediul unei
interfețe, constrâ ngerea fiind trimisă la nodul principal care va trebui să ia o decizie.
Având în vedere că pe viitor vor apă rea din ce în ce mai multe date de tip IoT ac este metode se vor
concentra pe înțelegerea comportam entului unui echipament, vor apă rea noi abordări în domeniul
algoritmilor ce stau la baza analizei de date și se vor dezvolta noi echipamente de analiză.
Odată cu creș terea numă rului de echipamente IoT va trebui o atenție acordată și administră rii acestor
echipamente. Această administrare include:
• Monitorizarea echipamentelor IoT;
• Raportarea și analiza defectă rilor;
• Administrarea securității;
• Actualizarea resurselor software ș i hardware.
Un alt aspect im portant care trebuie luat în considerare în cazul unei infrastructuri IoT este securitatea,
întrucât acest concept introduce o serie de riscuri de securitate specifice. Datorită componentelor acestor
sisteme pr ecum: dispozitivele inteligente, platformele l a care se conectează acestea, sisteme de operare
sau rețelele de comunicații , vor fi necesare tehnologii noi pentru a asigura protecția la atacurile
cibernetice care în ultima vreme au luat amploa re. Pentru securizare trebuie să se realizeze criptarea
comu nicațiilor și să se dezvolte tehnici de ră spuns la intențiile de interacțiune ale echipamentelor
impost oare.
Securizarea tehnologiilor IoT va fi un proces greu de dezvoltat deoarece majoritatea dispozitivelor dintr –
o astfel de infrastructură dispun de re surse de procesare reduse ș i de sisteme de operare care nu suportă
metode de securizare prea sofisticate. Este de așteptat ca în acest domeniu atacurile ș i amenințările de
securitate să evolu eze odată cu tehnologia în sine. Î n consecință este necesar ca so luțiile hardware ș i
software al e sistemelor IoT să fie continu u actualizabile în cazul apariției a noi tipuri de amenințări.
22
23
Capitolul 2 – Rețele de senzori fără fir
Având în vedere tema aleasă este foarte importa nt să vorbim despre rețele de senzori fără fir (WSN). Pe
baza unor astfel de rețele se pot realiza o gamă foarte vari ată de aplicații care au la bază capacitatea unor
circuite de a achiziționa date din mediul înconjurător prin intermediul senzorilor, de a le procesa, și de a
le utiliza. Foarte multe proiecte pot fi dezvoltate , datorită acestor rețele de senzori , precum cele ce doresc
realizarea d e locuințe inteligente, orașe inteligente etc.
În zilele noastre cercetarea rețelelor de senzori este un domeniu în plină dezvoltare și deschide noi direcții
de cercetare ce includ: controlul senzorilor, protocoale de comunicație, eficientizarea resurselor
energetice, capacitatea și durata de viață a rețelei.
Realizarea rețelelor de senzori wireless este o modalitat e de a ajuta la identificarea unor probleme de
mediu. Una dintre metode implică crearea unei rețele de senzori fără fir (WSN) în care fiecare senzor
transmite fără fir datele sau valoarea acelui senzor către nodul pri ncipal.
În capitolul acesta se vor defi ni rețelele de senzori wireless, se vor prezenta principalele topologii de
rețele și se vor evidenția unele constrâ ngeri impuse de aceas tă tehnologie.
2.1 Definire
O rețea de senzori wireless reprezintă o mulțime de echipamente interconectat e între ele î n vederea
comunicării. Pentru realizarea unei rețele de date fără fir este necesară o configurație aparte pentru
nodu rile de rețea, întrucât pe lângă modulul de procesare care măsoară și stochează datele este necesar
și un modul de comunicație prin radio -frecvență .
Un nod de rețea combină 3 mari funcționalități :
• Achiziția de date
• Procesarea datelor
• Comunicarea
De o bicei procesarea datelor este fă cută de u n microcontroler care reprezintă componenta principală la
care se interconectează atât senzorii cât și modulul care asigură comunicarea.
Modulul care se ocupă de comunicația radio trebuie ales în funcție de aplicaț ie, luând în calcul aria de
acoperire a rețelei. Există o gamă variată de module de comunicaț ie prin radiofrecvență ce funcționează
în ba nda ISM . Dacă dorim automatizarea unei locuințe se pot folosi module care să asigure o suprafață
mică de acoperire precum nRF24L 01+ sau dacă de exemplu , dorim să monitorizăm animalele sălbatice
în aria de acoperire a unei rezervații naturale se poate folosi un mo dul RF M96 care are la bază proto colul
de comun icație LoRa care asigură acoperire pe distanțe mai mari. Indiferent de modulul de comunicație
radio trebuie asigurată comuni carea între acesta și un modul de control prin diferite protocoale de
comunicare precu m SPI sau I2C.
Modulu l care se ocupă de procesare, mă surare și stocare poate fi constituit de un microcontroler precum
Atmega328 p sau STM32 sau chiar de un minicalculator precum cele produse de Rasp berry PI. Acest
modul trebuie să fie capabil să achizițio neze date din exterior prin intermediul senzorilor.
24
Având în vedere că majoritatea senzorilor sunt analogici se poate impune ca modulul de procesare să
dispună de pini analogici de intrare, conver toare de la semnal analogic la semnal digital (ADC). Pentru
a putea atașa un modul de comunicație în radiofrecvență trebuie avut în considerare tipul de conexiune
pe care î l suportă modulul respectiv.
Arhitectura unui astfel de nod de rețea este ilustrată în imaginea de mai jos.
Figura 2. 1 – Structura unui nod al rețelei fără fir
Figura de mai jos exemplifică o rețea de senzori fără fir care transmite date din locații diferite către niște
noduri principale de la care mai departe sunt transmise prin intermediul Internetului spre a fi stocate,
analizate, procesate și interpretate.
Figura 2. 2 – Rețea de senzori fără fir
25
2.2 Topologii de rețele
O rețea este alcătuită din noduri dispuse sub o anumită topologie. Prin to pologie de rețea se înțelege
dispunerea fizică în teren a elementelor care compun rețeaua de comunicație.
Cea mai întâlnită to pologie de rețea este punct la punct. Rețelele punct la punct dispun de numeroase
conexiuni între perechi de noduri individuale. Pentru a se realiza o conexiu ne este posibil ca un pache t
să trebuiască să treacă prin unul sau mai multe noduri intermediare. De obicei se folosesc șapte topologii
în cadrul acestei legături. (4)
Topologiile rețelelor punct -la-punct:
• Structură de tip inel;
• Structură neregulată;
• Structură centralizată (Stea);
• Structură completă (Multistea);
• Structură de tip linie;
• Structură ierarhizată (Arbore);
• Structură de tip Magistrală.
Nodurile implicate într -o topologie de rețea pot fi echipamente de interconectare sau terminale , iar arcele
pot reprezenta conexiuni fizice (directe sau indirecte).
2.2 Standarde folosite
Cea mai răspândită tehnologie de rețea wireless pentru echipamentele mobile este familia de standarde
IEEE 802.11 care a fost elaborată în anul 1997. Aceasta ocupă benz i de frec vențe diferite , de exemplu
pentru IEEE 802.11b și IEEE 802.11g este folosită banda de 2.4 GHz, iar protocolul IEEE 802.11 a
folosește banda de frecvență de 5GHz.
Standardul IEEE 802.11 a avut o contribuție notabilă în rețelele wireless timpurii și încă mai este folosit
în rețelele cu senzo ri multimedia care necesită o lă rgime de bandă mai mare, dar consumul său mare de
putere îl face inadecvat în rețelele fără fir de senzori de joasă putere.
Pentru a satisface nevoile de consum redus de putere ale rețelelor fără fir s -a decurs la dezvoltarea unui
nou protocol care să asigure un consum redus de energie și care să aibă rata de transfer mai redusă.
Protocolul IEEE 802.15.4 a fost special dezvoltat pentru comunicațiile fără fir ce se fac pe distanțe scurte
cu un consum redus de putere.
26
Figura 2. 3 – Topologie de rețea cu mai multe hop -uri și cu un singur hop
Într-o rețea de senzori wireless cu o topologie cu un singur hop, fiecare nod comunică cu nodul principal
făcând un singur salt. Acea stă topologie este ideală pentru rețele ce necesită o acoperire mică cum ar fi
un aparta ment , o casă de dimensiune mică , o grădina , etc.
În multe situații rețelele de se nzori wireless trebuie să acopere zone de întinderi mari, iar în acele situații
acest tip de topologie care execută un singur salt , în vederea comunicării , nu este p otrivită. P entru a
asigura o comunicare pe distanțe mari și pentru a asigura o putere de emisie mare, folosind un singur
salt, este nevoie de un consum mare de energie.
Pentru a rezolva acest neajuns s-a pus problema dezvoltării unei topologii de rețea de tip plasă care să
asigure o comunicare prin executarea mai multor salturi până la nodul principal. A stfel, consumul de
energie este menținut redus, dar este necesar ca numă rul de noduri să fie crescut. Principala problemă a
acestei topo logii de tip plasă este aceea că implică de zvoltarea unei metode de dirijare a datelor de la un
nod la altul , pentru a se evita coliziunile dintre pachetele de date venite de la diverse noduri.
2.3 Constrângeri impuse de rețelele de senzori fără fir
Analizând mai în amănun t rețelele de senzori fără fir se constată că , spre deosebire de alte sisteme
distribuite , impun o gamă de constrângeri pe care la alte tipuri de sisteme nu le vom întâlni. De ce le mai
multe ori aceste constrângeri atrag după ele și modificări asupra structurii rețelelor și duc la elaborarea a
noi protocoale de comunicare diferite de cele din alte tipuri de sisteme distribuite.
Voi enumera mai jos constrângerile acestor tipuri de rețele:
• Nodurile dispun de energie limitată
• Incompatibilitatea cu algoritmii de centralizare existenți
• Amplasarea în condiții nefavorabile a nodurilor
• Siguranța datelor stocate și achiziționate de un nod
27
Rețelele de noduri cu senzori fără fir necesită un c onsum redus de energie deoarece , de cele mai multe
ori acestea sunt alimentate de acumulatori care trebuiesc încărcați periodic sau înlocuiți. Pentru a rezolva
această constrângere este necesară dezvoltarea unei soluții de încărcare a acumulatorilor unui n od de
rețea.
De obicei , în practică , datorită dimensiunilor mari și constrângerilor referitoare la consumul de energie ,
rețelele de senzori wireless sunt neadaptabile unui algoritm centralizat.
Întrucât nodurile vecine trebuie să com unice între ele în vede rea realizării unui algoritm de comunicare
local, în urma rea lizării unei astfel de conexiuni la nivel local , apare avantajul eficientizării consumului
de energie.
Amplasarea în condiții nefavorabile este o constrângere ce se referă la faptul că de multe o ri acest e tipuri
de rețele deservesc sist eme de monitorizare și control care achiziționează date din mediul înconjurător în
condiții nefavorabile precum : praf, umiditate, ploaie, îngheț, zăpadă, etc.
Constrângerea , în ceea ce privește siguranț a datelor sto cate și prelucrate la nivelul fiecărui nod, este
importantă întrucât comunicațiile de tip wireless se realizează în benzi de frecvențe libere și de aceea pot
fi ușor interceptate de entități străine. Această constrângere poate fi remediată folosindu -se cri ptarea
comunicațiilor, blocarea accesului la date prin autentificare sau chiar blocarea totală a accesului.
28
29
Capitolul 3 – Resurse Folosite
3.1 Resurse Hardware
După cum a fost prezentată structura unei r ețele în ca pitolul precedent , se constată c ă pentru rea lizarea
unui sistem de achiziție de date și de comandă este nevoie de o rețea de s enzori wireless care să cuprind ă
o serie de noduri care s ă realizeze interacțiunea cu mediul exterior și un nod la nive lul căruia să se
realizeze centralizarea acestor date.
Un nod de rețea are la bază două elemente principale:
• Modulul de procesare
• Modulul de comunicare
Pentru realizarea acestui p roiect s -au ales soluții care s ă acopere toate necesitățile unui astfel de si stem
precum : consumul redus de energie, mobilitatea, distanța maximă de comunicare dintre noduri și nu în
ultimul rând costul redus al echipamentelor necesare realizării unui astfel de nod.
Analizând aceste necesități am constatat că modulul de procesare p entru un nod senzor poate fi realizat
cu ușurință cu ajutorul un ui microcontroler de joasă putere.
Pentru nodul principal la nivelul căruia se face centralizarea datelor venite din rețea, având în vedere că
acesta va tre bui s ă fie capabil s ă asigure gă zduirea unui server cât și să asigure o conexiune la Internet
am ales folosirea unui minicalculator Raspberry PI Zero W . Acest model de minicalculator este unul
dintre cele mai mici calculatoare realizate la momentul de față, aspect ce poate reprezenta de mul te ori
un avantaj.
Pe lângă pă rțile de procesare prezentate mai sus se pune și problema comunicării într -o rețea fără fir.
Pentru a rezolva și acest aspect am ales fol osirea unui modul de comunicare fabricat de firma Nordic
Semiconductors și anume nRF24L01 +.
Cipul nRF24L01+ este un dispozitiv des tinat transmiterii și recepțion ării datelor prin radiofrecvență
folosind banda de frecvențe dintre 2.4 – 2.4835 GHz , cu un consum foarte redus de putere. Această bandă
este nelicențiată , fiind folosită pentru dezv oltarea proiectelor industriale, de cercetare și medicale (ISM).
În cadrul acestui capitol se vor prezenta resursele fizice necesare realizării unui sistem de achiziție de
date și de control ce are la bază o rețea de senzori fără fir.
30
3.1.1 Modulu l de procesare
Microcontrolere
Un microcontrol er este u n tip de circuit care integrează un microprocesor și alte dispozitive per iferice
într-un singur chip punâ ndu-se accent pe un cost redus de producție și consum redus de energie electrică.
Principala di ferență dintre un microcontroler (µC) și un microprocesor (µP) o constituie faptul că un µC –
ul integrează memoria de program, memoria de date și alte interfețe de intrare -ieșire sau periferice. (5)
Acest lucru se poate vedea suge stiv în imaginea 3.1.
Cele mai notabile caracteristici ale unui microcontroler sunt dimensiunea mică, consumul redus de putere
și nu în ultimul rând costul redus . (6)
Figura 3. 1 – Caracteristici ale micro controlerelor
Caracteristicile unui microcontroler sunt următoarele :
• unitatea centrală de procesare (µP core) cu o arhitectura care poate fi pe 8, 16, 32 sau 64 de biți;
• memorie de date RAM (volatilă) sau Flash/EEPROM (nevolatilă) pentru date sau program;
• porturi digitale de intrare -ieșire;
• interfețe seriale (RS232, SPI, I2C, CAN, RS485);
• timere, generatoare de PWM sau watchdog;
• convertoare analog -digitale/ digital -analogice;
• suport pentru programare și debugging (7)
31
Datorită i ntegrării numărului mare de periferice într -un singur cip și a costului redus de producție, un
microcontroler operează la fr ecvențe de zeci de MHz, acest lucru implicând viteza sa redu să de operare,
cu un ordin de m ărime mai mică de cât în cazul unui microp rocesor.
Pentru alegerea unui micr ocontroler trebuie urmărite niș te repere în funcție de necesitățile proiectului,
de cele mai multe ori acestea fiind:
• Configurația
• Dimensiunile cipului
• Limbajul de programare
• Prețul
Atunci câ nd alegem un microcontroler t rebuie luată în considerare configurația acestuia în ceea ce
privește dacă dispune sau nu de convertoare analogice -digitale sau digitale -analogice (ADC/DAC),
număr ul de pini de intrare sau de ie șire, fie ace știa analogici sau digitali, tipul de comunicație de care
dispune, cât și timpul de r ăspuns , care trebuie s ă fie unul cât mai mic.
Costul unui µC depinde în mare mă sură de numă rul de periferice integrate. Cu câ t numă rul acestora este
mai mare cu atâ t nivelul de integrare creș te ducând la un cost de produ cție mai mare. Din această cauză,
arhitecturile de µC pe piață la ora actuală variază î n limite destul de largi, de la c ipuri cu doar 6 pini de
I/O până la procesoare digitale de semnal (DSP) sau procesoare cu arhitecturi ARM. (7)
Pentru acest proiect ca și modulul de procesare am ales folosirea unor plăci de dezvoltare Arduino
realizate în jurul unui microcontroler Atmega328p.
Figura 3. 2 – Arduino UNO
Arduino este o placă de dezvoltare care are la bază un microcontroler Atmel AVR pe 8 biți. Softul de
dezvoltare este constituit dintr -un bootloader propriu și un compilator ce dispune de un limbaj de
programare asemănător cu limbajul C/C++.
Acest microcontroler conține un convertor analog digital (ADC) cu o r ezoluție de 10 b iți, aceasta
însemnând că există 1024 valori sau divizări ale tensiunii de referință disponibile. Achiziția de date de la
senzori, procesarea acestora, analizarea și afișarea rezultatelor sunt principalele operații pe care trebuie
să le îndeplinească în cadrul aplicațiilor.
32
Aplicațiile dezvoltate pe o astfel de platformă sunt accesibile și prin intermediul altor platforme precum
LabVIEW, Matlab, Python si C/C++. (8)
Această placă ajută la citirea informațiilor de l a dispozitive de intrare precum senzori, antene,
potențiometr e și poate distribui informație către dispozitive de ieș ire precum un LED, difuzor, afișoare
sau că tre memorii externe.
În imaginea 3.3 se poate observa arhitectura generală a unei plăci Arduino . Principala componentă este
microcontrolerul Atmega 328p, pe care îl putem observa în mijlocul plăcii. L a nivelul acestuia se
realizează recepția și transmisia de date. Mufa USB este folosită pentru a conecta partea aceea a plăcii
care este folosită la în cărcarea programului pe microcontroler cu ajutorul calculatorul ui. Tensiunea sa de
funcționare este de 5V, ac easta putând fi oferită de la un alimentator sau din USB. Pinii analogici de la
A0 la A5 sunt folosiți ca pini de intrare, iar pini i de intrare/ieș ire digitali sunt numerotați de la 2 la 13.
Arduino dispune de pini de alimentare care pot avea 3.3V și 5V.
Minicalculatorul Raspberry PI
Figura 3. 3 – Raspberry PI Zero W
Aceste plăci stau la baza a multe aplicații de IoT. Ele au în componența lor, asemeni unui calculator, un
procesor, un cip grafic, o memorie volatilă (RAM), o se rie de conectori ce asigur ă conexiunea cu alte
periferice cat ș i o mufă de alimentare. A cest minicalculator funcționează ca și un calculator obișnuit ,
având nevoie de minim o tastatur ă necesară scrierii programelor și a comenzilor ș i a unui monitor pentru
afișarea grafică de date și imagini.
Placa Raspberry Pi Zero W este considerată unul din cele mai mici calculatoare de pe piață care are la
bază un p rocesor realizat de Broadcom .
Acest minicalculator dispune de un procesor cu frecvența de lucru de 1GHz ș i o memorie RAM de 512
MB. Acest lucru va ajuta atât la rularea unor programe de nivel jos cât și rularea unor algoritmi complecși.
33
O altă caracterist ică este aceea că pe acest calculator se pot rula cu ușurință distribuții ale sistemelor de
operare Linux precum Raspbian sau chiar și sistemul de operare Windosws IoT.
Raspberry Pi Zero W pune la dispoziție conectivitate WiFi și Bluetooth, acest lucru ofe rind posibilitatea
integrării în domeniul IoT. Pentru expunerea imaginilor și a datelor avem conectivitatea HDMI.
Pentru aplicații , în care unul din scopuri este de a achiziționa imagini, acest minicalculator dispune de
un slot pentru cameră video cât și de conexiuni de tip microUSB pentru date. O parte din aceste aspecte
pot fi observate și pe Figura 3.3 .
Caracteristici tehnice:
• Procesor SoC BCM2835;
• Frecvența de operare a procesorului: 1 GHz;
• Memorie RAM: 512MB;
• Conectivitate WiFi 2.4GHz;
• Conectivitate Bluetooth;
• Slot card microSD;
• Conector miniHDMI;
• Conector micro -B USB pentru alimentare;
• Conector micro -B USB pentru date;
• Conector CSI pentru cameră foto/video;
• Pinout de 40 pini GPIO;
• Compatibil cu extensiile HAT/pHAT;
• Dimensiuni: 65 x 30 x 5 mm.
3.1.2 Senzorii de temperatură și de umiditate
Pentru a realiza nodurile cu senzori am ales folosirea a doi senzori de temperatură și umiditate digitali și
anume DHT11 și AM2320.
Primul senzor este DHT11 (Figura 3.4) .
Figura 3 . 4 – Senzor DHT11
Acesta are următoarele specificații tehnice:
• Tensiunea de alimentare: 3v3 -5v;
34
• Curentul maxim 2.5 mA;
• Gama de măsurare a umidității: 20% -95% RH ;
• Acuratețea măsurării umidității: ±5% RH ;
• Gama de măsurare a temperaturii: 0 °C – 60 °C ;
• Acurateț ea măsurăr ii temperaturii: ±2 °C ;
• Nu funcționează sub 0°C .
Temperatura este măsurată de un NTC, iar umiditatea este măsurată folosindu -se un senzor capacitiv.
Este precalibrat și oferă la ieșire un semnal digital. (9)
Cel de -al doilea senz or este unul mai precis ș i anume AM2320.(Figura 3.5)
Figura 3. 5 – AM2320
• Tensiune de alimentare: 3.1V – 5.5V;
• Tensiune de alimentare recomandată: 5V;
• Curent maxim consumat: 950uA;
• Curent mediu consumat: 350uA;
• Curent de ieșire: maxi m 8mA;
• Interval măsurare umiditate: 0%RH – 99.9%RH;
• Rezoluție măsurare umiditate: 0.1%RH;
• Interval măsurare a temperaturii : -40 ~ +80 °C;
• Poate comunica prin interfe țele I2C sau 1Wire.
Acesta poat e mă sura o umiditate cu acuratețe de 4%RH la o temperatură d e 25 °C. (10)
35
3.1.3 Modulul de comunicație
Construirea unei rețele de senzori fără fir impune folosirea a multe resurse hardware și software. Fiecare
nod necesită pe lâ ngă dispozitivul de achiziție de date și un dispo zitiv de conexiu ne fără fir .
În cadrul acestui proiect ca și module de comunicație s -au folosit integratele r adio nRF24L01+.
Figura 3. 6 – Modul radio nRF24L01+
Cipul nRF24L01+ este un dispozitiv des tinat transmiterii și recepționă rii datelor în domeniul radio.
Acesta lucrează la frecventa ISM de 2.4 GHz și suportă rate de biți de 250kbps, 1Mbps și 2Mbps .
Acest modul poate fi programat prin intermediul interfeței de comunicare SPI. Un alt aspect notabil al
acestui modul de comunicați i este faptul că este capabil să întrețină șase comunicații diferite simultan.
Din punct de vedere al caracteristicilor radio acest integrat folosește modulaț ia GFSK (Gaussian
Frequency -Shift Keying). GFSK este o formă specială a modulației clasice FSK (Fr equency -Shift
Keying) unde informația binară este transpusă în diferențe discrete de frecvență ale purtătoarei. GFSK
este folosită de asemenea și în alte tehnologii precum Bluetooth.
Acest integrat de comunicații suportă 126 de canale de frecvenț e indepen dente ș i funcționează în banda
dintre frecvențele 2400 MHz și 2525 MHz, dar din aceste 126 doa r 83 sunt libere în toate țările. D e
exemp lu, în America frecvența de 2483 MHz nu este liberă.
Atunci când alegem să folosim rata de biți de 250 kbps sau 1 Mbps integratul nRF24L01+ va folosi o
bandă de 1 MHz, pe când în situația în care rata de biți este setată la 2 Mbps banda va fi de 2 MHz.
Interfața de comunicație SPI
Pentru ca m odulul de comunicație nRF24L01+ să comunice cu modulul de procesare folosește un
protocol de comunic ație serială sincron numit SPI (Serial Peripheral Interface), dezvoltat de compania
Motorola. Acest tip de conexiune permite comunicarea bidirecțională între dispozitive , adică transferul
datelor se poate face în ambele direcții simultan (full-duplex). Dispozitivele implicate într-o astfel de
conexiune comunică folosind o relație de tipul master/multi slave (adică nu sunt suportați mai mulți
masteri), master -ul fii nd dispozitivul ce inițiază transmiterea pachetelor de date.
Conexiunea SPI se mai numește și conexiune 4 fire deoarece implică 4 fire de legătură între d ispozitivele
ce folosesc această interfață de comunicarea și în figura 3.7. (11)
36
• SCLK – Serial Clock (aceas ta este ieșirea master -ului)
• MOSI/MISO – Master Output, Slave Input (acesta este ieșire a master -ului)
• MISO/SOMI – Master Input, Slave Output (acesta este ieșirea slave -ului)
• SS – Slave Select (activa pe 0 logic, ieșirea master -ului)
Figura 3. 7 – Comunicație SPI Master -Slave
Se observă că în cadrul ac estui tip de conexiune avem două fire pe care se tra nsmit date (MOSI ș i MISO).
De asemenea , se mai observă că slave -ul este selectat cu ajutorul semnalului de selectare (SS), pentru
fiecare slave fiind nevoie de un fir de selec ție individual ca în Figura 3.8 .
Figura 3. 8 – Comunicație Master – Multi -Slave
Pentru a iniția o comunicație de tip SPI m asterul trebuie să aibă frecvenț a de ceas cel mult egală cu cea
suportată de slave. Masterul setează apoi cip ul slave cu care vrea să comunice, punâ nd 0 pe linia de SS
dinspre acesta.
În timpul unui ciclu SPI, tra nsmiterea datelor este complet bidirecțională:
37
– masterul trimite un bit pe l inia MOSI, iar slave -ul îl citește de pe aceeaș i linie;
– slave -ul trimite un bit pe l inia MISO, iar slave -ul îl citește de pe aceeaș i linie;
Acest tip de comunicație implică de regula doi regișt rii de shiftare (Shift Register), unul în mast er și unul
în slave, conectați în ciclu:
Figura 3. 9 – SPI folosind regiștrii de shiftare
În cazul proiectului de față modul ul de comunicare va funcționa în modul slave , iar m odulul de comandă
va funcționa î n modul master . În vederea comunicării se pot alege vite ze de comunicare de la 1Mbps
până la 2 Mbps.
Așa cum se po ate vedea și în figura3. 10pentru a se iniția o comuni cație între modulul de comandă și
cipul nRF24L01+ trebuie ca bitul CSN să fie setat la 0 logic. Atâta timp cât pinul CSN este setat la 0
modulul de comunicare va avea activată comunicația SPI, iar în ved erea comunicării va fi necesară și
setarea pinului CE pentru a scoate cipul din starea de așteptare .
Figura 3. 10 – Citirea și scrierea datelor prin SPI (12)
38
Setul de instrucțiuni necesare configurării unei conexiuni SPI se poate vedea în tabelul din anexă.
Procedeul de citire al datelor din regiștrii modulului de comunicare constă în trimiterea unei comenzi de
citire alături de adresa locației de la care se dorește cit irea, iar apoi dimensiunea în oc teți a dat elor pe
care dorim să le citim.
Conexiunea fără fir
Așa cum am spus ma i sus integratul este capabil să folosească trei rate de biți precum 250 kbps, 1 Mbps
sau 2 Mbps. Pentru configurarea acestora se va seta valoarea registrului RF_SETU P, în funcți e de rata
de biți dorită. Pentru a seta rata de 250 kbps se setează RF_DR_LOW sau cei 2 biți din RF_DR_HIGH.
Atunci câ nd RF_DR_LOW este setat, RF_DR_HIGH va fi ignorat.
Foarte important în vederea comunicării este setarea frecvenței radio a canalului pe ca re se dorește
realizarea comunicației. Domeniul de fr ecvențe în care se poate comunica este într e 2.4 GHz și 2. 525
GHz. Pentru a realiz a o comunicație cu ratele de biți de 250 kbps sau 1 Mbps trebuie ca lățimea de bandă
să fie de 1 MHz, iar pentru o rat ă de biți de 2 Mbps între canale se va alege o bandă de 2 MHz într e
canale.
Pentru selectarea frecvenței canalului de comunicare se va seta registrul RF_CH, iar pentru calculul
frecvenței se va folosi formula următoare:
F = 2400 kHz + RF_CH (MHz)
Pentru a pu tea comunica dou ă module trebuie să folosească același canal, pe aceeași frecvență și aceeași
rată de biți de transmisie /recepție.
Tot în vederea realizării unei conexiuni este necesară setarea puterii amplificatorului de semnal. Pentru
configurarea aceste i puteri avem la dispo ziție biții RF_PWR din registru l RF_SETUP. Setările acestora
sunt ilustrate în tabelul de mai jos.
RF_PWR Amplificarea
antenei Curentul
consumat
11 0 dBm 11.3 mA
10 -6 dBm 9 mA
01 -12 dBm 7.5 mA
00 -18 dBm 7mA
Tabel 3.1 – Setarea puterii amplificatorului de semnal
39
Modurile de operare ale modulului de comunicare
Modul Oprit (Power O ff Mode)
În acest mod de operare cipul nRF24L01+ este oprit, în consecință consumul său de putere va fi foarte
redus. To ate valorile stocate în regiștrii sunt păstrate și conexiunea SPI este de asemenea păstrată activ ă
permițând în orice moment s chimbarea valorilor din regiștrii . Pentru a trece din acest mod în modul
pornit , trebuie setat bitul PWR_UP din registrul CONFIG la 0.
Modul de Așteptare (Standby Mode)
Acest mod de funcționare este de două tipuri: modul de așteptare 1 (Standby Mode 1) și modul de
așteptare 2 (Standby Mode 2). În ambele moduri valorile din regiștrii interni sunt salvate.
• Modul de așteptare 1
Acest mo d este activat setând bitul PWR_UP din registrul CONFIG la 1 logic, adică tot timpul când nu
se trimite ceva. Intrarea în acest mod se face când bitul CE este setat la 1 ș i iese din acest mod când este
setat pe 0. Acest mod de operare este utilizat datorit ă timpului mic de trecere de la modul RX/TX pe care
îl oferă și pentru a reduce c onsumul de curent prin faptul că își menține starea de activare doar pentru
intervale de timp mici.
• Modul de așteptare 2
Acest mod de operare este utilizat atunci când integr atul utilizează comunicarea pe mai multe canale.
Cipul nRF24L01+ intră î n modul de operare 2 atunci câ nd bitul CE e ste setat la 1 logic și când coada de
transmisie (TX FIFO) este liberă. Dacă un nou pachet este încărcat în co ada de transmisie circuitul va
începe transmiter ea sa după o întârziere de 130 µs dat orată funcționarii circuitului.
Modul de Recepție (RX Mode)
Acest mod de funcționare este unul activ deoarece cipul radio nRF24L01+ este folosit ca și receptor.
Pentru a iniția acest mod d e funcționare trebuie setați biții PWR_UP, PRIM_RX și CE la 1 logic.
În acest mod cipul este capabil să efectueze o că utare continuă a semnalelor ce conțin pachete valide, iar
dacă un astfel de semnal este detectat , conținutul mesajului recepționat va fi trimis într -un slot vacant
din coada de recepție. Deci , în acest mod de operare , cipul ascultă, iar atun ci când primeș te un mesaj
valid care are CRC -ul și adresa corectă stochează acest pachet într -o coadă. Există situații în care coada
este plină, iar atunci pachetele recepționate se vor pierde nefiind spațiu pentru stocarea lor.
Tot în cadrul acestui mod de operare se poate folosi și detectorul de semnal (RPD – Recived Power
Detector), acesta fiind activ doar când în mediu există un semnal cu putere mai mare de -64dBm pentru
o durata de timp de cel puțin 40 us. (12)
Ieșirea din acest mod d e operare se face doar atunci câ nd m icrocontrolerul care gestionează stă rile va
impune modul de așteptare 1 sau modul oprit.
40
Modul de Transmisie (TX Mode)
Modul de transmisie este de asemenea un mod activ de operare în cadrul căruia se face transmiterea
pachetelor. Pentru a intra în acest mod de f uncționare sunt necesare urmă toarele etape:
• setarea bi tului PWR_UP la 1 logic;
• setarea bitului PRIM_RX la 0 log ic;
• în coada de transmisie (TX FIFO) să existe un pachet;
• iar bitul CE trebuie să fie setat la 1 logic mai mult de 10 µs.
Cipul nRF24L01+ va rămâne în modul de transmisie până când termină de transm is un pachet complet.
Atunci câ nd bitul CE este setat la 0 logic starea sa se va schimba cu starea de așteptare și atunci câ nd CE
este setat la 1 logic dacă există un pachet în coada de transmis ie (TX FIFO) se va începe o nouă
transmisie . Dacă după o comunicare între două dispozitive coada de transmisi e este goal ă, atunci starea
sa va fi schimbată în starea de așteptare 2.
Modurile de operare ale integr atului împreună cu configurările de regiștrii necesare pot fi observate în
tabelul de mai jos:
Mod de
funcționare PWR_UP PRIM_RX Pin CE Starea cozii
RX 1 1 1 –
TX 1 0 1 Golire buffere pe
RF
TX 1 0 Pulsuri de minim
10 us Un singur pachet e
trimis din coadă
Standby – II 1 0 1 Cozi goale
Standby – I 1 – 0 Nu se transmite
nimic
Power Down 0 – – –
Tabel 3.2– Modurile de funcționare ale inte gratului
Protocolul de comunicare Enhanced ShockB rust (ESB)
Enhanced ShockB rusteste un protocol de comunicație ce suportă transmiteri bidirecționale de pachete de
date, stocarea pachetelor în niște cozi specifice, transmiterea mesajelor de confirmare (ACK ) și
retransmiterea a utomată în cazul unei comunicații eșuate. ESB poate realiza comunicație radio cu un
consum foarte redus de putere, iar dezvoltarea codul ui de implementare este ușoară, a cesta fiind
încapsulat în cipul de comunicație radio nRF24L01+ .
Acest protocol care realizează tranzacția de pachete este inițiat de procesul de transmisie și se termină cu
succes atunci când emițătorul primește un mesaj de confirmare (ACK) de la receptor. Pentru a realiza o
conexiune bidirecțională receptorul are posibi litatea să atașeze un mesaj util mesajului de confirmare.
(12)
41
Figura 3. 11 – Principiul de funcționare ESB
Dacă în cadrul operației de transmisie ( TX) nu se primește un mesaj de confirmare (ACK) după realiz area
primei transmisiuni, se vor iniția noi retransmiteri pană când pachetul de confirmare ( ACK ) va fi primit.
ESB pune la dispoziție:
• încapsularea autom ată a pachetelor și sincronizarea comunicați ei
• trimiterea și recepționarea unor mesaje de înștiința re
• retrimiterea pachetelor automat
• alocarea dinamică a dimensiunii mesajului transmis
• 6 adrese de comunicare pentru o conexiune în stea
La ba za funcționă rii acestui protocol stau niște principii foarte simple. Î n timpul funcționării integratului
acesta asc ultă mediul exterior și la recepția unui pachet se verifică CRC -ul, iar în cazul în care acesta
corespunde celui calcu lat la nivelul receptorului se v a trimite un mesaj de aprobare ( ACK ), iar a poi se
vor salva datele într -una dintre cozile goale de recepți e. Există și situații în care câmpurile de CRC nu
corespund și în situația respectivă pachetele vor fi ignorate și receptorul va trimite un mesaj de NAK.
Mesajul ACK reprezi ntă o înștiințare pozitivă, adică un mesaj care confirmă primirea unui pachet valid ,
pe când NAK este u n mesaj ce înștiințează transmițătorul că nu a primit un pachet valid. (12)
Acest p rocedeu este ilustrat sugestiv î n organigram a din figura 3.12.
42
Figura 3. 12 – Procedeul de comunicare ES B
Formatul Pachetelor Enhanced ShockBrust
Acest tip de pachet este format din cinci câmpuri: preambul, adresă, control, încărcătură si CRC(Cyclic
Redundancy Check). Acest format poate fi vă zut in figura de mai jos .
Preambul
1 octet Adresa integratului
3-5 octeți Câmp de control
9 biți Date
0-32 octeți CRC
1-2 octeți
Figura 3. 13 – Formatul pachetului ESB
Câmpul de preambul
Este o secvență de biți folosită pentru a sin croniza demodulatorul c u receptorul (fluxul de biți de la
intrare) . Această secvență numită preambul are dimensiunea de 8 biți ș i este fie secvența 01010101 fie
10101010.
• în situația în care primul bit al adresei este 1 atunci secvența de preambul v a fi setată automat la
10101010
• dacă primul bit al adresei este 0 atunci secvența de preambul va fi setată la 01010101.
Acest lucru este făcut pentru a asigura faptul că există suficiente t ransmisiuni inițiale astfel încâ t
receptorul să aibă timp să se stabilizeze.
43
Câmpul de adresă
În această secvență este stocată adresa rece ptorulu i. Ac eastă adresă ne asigură că un pachet c are este
detectat este într -adevă r recepționat de receptorul corect, în acest mod se previne comuni carea nedorită
între sisteme diferite ce comunică prin intermediul aceluiași canal de comunicație. Această adresă se
poate configura în registrul SETUP_AW. Valoare a acestei adrese este dată de că tre utilizator prin scrierea
regiștrilor RX_ADDR_P0 -5, corespunzător fiecărui pipe.
Câmpul de control
Încărcătură utilă
6 biți PID
2 biți NO_ACK
1 bit
Figura 3. 14 – Formatul câmpului de control
Câmpul de control al pachetului are în componența sa un câmp de 6 biți în care se stoch ează lungimea
încărcăturii, un câmp de 2 biți care conține un identificator al pachetului (PID) și un bit NO_ACK .
• Lungimea încărcăturii
Acest câmp de 6 biți specifică lungimea încărcăturii u tile în octeți. Lungimea încărcăturii poate varia
între 0 ș i 32 de octeți. Acest câmp va fi activat doar dacă se folosește alocarea dinamică a încărcăturii.
• Identificatorul (PID)
Acest câ mp de 2 biți ajută la detectarea faptului că un pachet este transmis acum sau este unul retransmis.
Acest lucru ajută la prevenirea recepționării aceluiași pachet de mai multe ori, câmpul acesta este automa t
incrementat de fiecare dată câ nd transmiță torul primește un pachet prin interfața SPI (pachet ce urmează
a fi transmis).
• Flag-ul de infirmare (NO_ACK)
Acest flag poate fi utilizat doar când bitul NO_ACK este setat pe 1 logic. Într -o comunicație de tipul
acesta este uneori util ca t ransmițătorul să fie informat că receptorul a primit cu s ucces pachetul. Acest
lucru se face prin setarea bitului NO_A CK la 0 logic, iar în situația î n care o as tfel de informație nu este
utilă se poate opta pentru n eutilizarea acestei opțiuni setâ nd bitul NO_ACK la 1 log ic. (12)
Câmpul încărcăturii utile
În acest câmp se stochează, așa cum îi spune și numele, conținutul util a l pachetului pe care dormim să
îl transmitem. Acesta poate avea o dimensiune variabilă de la 0 p ână la 32 octeți.
CRC (Cyc lic Redundancy Check)
Acest câmp est e de 1 sau 2 o cteți și este primordial în detecția erorilor de comunicare și anume
redundanța recepției acel uiași pachet. El este calculat î n funcție d e câmpul de adresă și de câ mpul
încărcăturii. N iciun pachet nu va fi primit dacă acest câ mp nu este recunoscut. Acest mecanism este
implicit setat la valoarea 1 și poate fi modificat în registrul CONFIG la bitul CRC.
La calcular ea acestui câmp se folosesc două ecuații polinomiale:
• 1 octet : 𝑋8+𝑋2+𝑋+1, valoarea de î nceput 0xFF
• 2 octeți : 𝑋16+𝑋12+𝑋5+1 ,valoarea de început fiind 0xFFFF (12)
44
Alocarea statică sau di namică a dimensiunii pachetelor
Mecanismul „Enhanced ShockBrust ” permite două tipuri de alocări: statică și dinamică. Î n lipsa oricărei
preferințe alocarea memoriei pentru pachete este cea statică. Folosind alocarea statică toate pachetele
transmise într e emițător și receptor au aceeaș i dimensiune.
Folosirea alocării statice se face modificând registrul RX_PW_Px din cadrul circuitului de recepție.
Dimensiunea încărcăturii utile , de la nivelul circuitului de transmitere , este dată de numărul de octeți
numă rați la nivelul cozii de transmisie (TX_FIFO) ș i trebuie obligatoriu să fie aceeași dimen siune ca și
cea a valorii stocat e în registrul RX_PW_Px de la nivelul circuitului de recepție.
Al doilea mod de alocare a dimen siunii încărcăturii utile este cel dinamic. Acest mod permite emițătorului
să transmită mesaje cu dimensiune variabil ă către receptor. A locare a dinamică oferă avantajul că nu mai
este necesar ca în cazul unei transmi siuni de pachete de dimensiuni diferite , dimen siunea standard să fie
aleasă în funcție de dimensiunea celui mai mare pachet.
La nivelul receptorului mesajul poate fi deco dificat de că tre nRF24L01+ într -un mod automat folosind
tot registrul RX_PW_Px. Microcontrolerul poate citi lungimea mesajului primit folosindu -se de comanda
R_RX_PL_WIND. Pentru act ivarea acestui tip de alocare a dimensiunii trebuie setat bitul EN_DPL din
cadrul registrului FUTURE la 1 logic, i ar la nivelul receptorului registrul DYNPD trebuie setat. (12)
Procedeul autom at de tranzacționare de pachete
Acest procedeu este foarte util deoarece per mite retrimiterea unui pachet pană când acesta a fost
recepționat corect. Atunci când pachetul a fost primit cu succes este trimis în mod automat un pachet de
confirmare că tre emiț ător, numit ACK, iar în situația în care emițătorul nu primește acest pachet va
reiniția transmiterea mesajului.
Pentru activarea modului de transmitere al pachetelor ACK este necesară setarea registrului EN_AA,
având, de asemene a, posibilitatea să transmi tă ală turi de acest mesaj de confirmare și un mesaj util.
Modul acesta permite retransmitere a ultimului pachet dintr -o coadă de transmisie până când
transmițătorul primește înapo i mesajul ACK sau până când emiț ătorul a epuizat nu mărul stabilit de
retransmi teri al mesajelor. Acest numă r de retransmiteri este configurabil setând b iții ARC din cadrul
registrului SETUP_RETR.
Tot în cadrul acestui procedeu automat se poate seta și timpul dintre două retrimiteri consecutive ale
emițătorului. Dacă rata de bit este setată la 1 sau 2 Mbps este suficient un timp de 500 µs, iar pentru rata
de 250 kbps este un timp variabil în funcție și de dimen siunea pachetului transmis, timpul variind într e
500 µs și 1500 µs. (12)
Cele trei etape ale modului de retransmitere sunt următoarele :
• Transmiterea pachetului ;
• Recepți onarea pachetului ;
• Primirea sau nu a pachetului de confirmare urmată de trecerea la modul de transmisie .
45
Aceste 3 etape sunt comutate automat atunci câ nd modul de retransmisie este activat , în situația în care
se dorește folosirea unui mod de retrimitere și înștiințare de către utilizator dar cu dezavantajul reducerii
puterii de calcul.
Modelul MultiCeiver
Acest model are la bază modelul de topologie stea prezentat în capitolul an terior și se referă la faptul că
acest modul de comunicare este capabil să comunice prin intermediul a șase conducte (pipe -uri)diferite
cu șase dispozitive simultan. În cadrul acestui model o conductă este văzută ca un canal l ogic suprapus
peste unul fizic. Integrat ul nRF 24l01+ este capabil să răspundă la șase canale logice folosind a celași
canal fizic.
Figura 3. 15 – Modelul Multiciver
Toate pi pe-urile logice au în comun urmă toarele setări:
• CRC activ/inactiv (este activ mereu atunci când modu l Enhanced ShockBurst este activ)
• Modul de calcul ac CRC -ului pe 1 sau 2 octeți
• Dimensiunea adresei
• Frecve nța canalului de comunicație
• Viteza cu care se realizează comunicația
• Amplificarea semnalului (LNA)
Toate canalele de comunicație logice sunt activate setând registrul EN_RXADDR. Implicit doar canalele
logice 0 și 1 sunt ac tive, fiecare alt canal logic fiind configurat prin intermediul registrului
RX_ADDR_PX.
46
Fiecare canal logic poate avea adrese de până la 5 octeți. Canalul logic 0 are o adresă unică f ață de 1, iar
canalele lo gice de la 1 la 5 folosesc acee ași 4 cei mai semnificativi octeți, doar cel mai nesem nificativ
octet fiind diferit.
Într-o comunicație un receptor poate comunica cu mai mul ți emițători pe canale de comunicație diferite.
Pentru a ev ita, în astfel de situații , transmiterea unui mesaj de confirmare greșit către un alt transmițător
se vor folosi adresele de transmitere care trebuie să corespundă cu cea a canalului logic pe care s -a primit
pachetul, ia r transmițătorul trebuie să aibă ca și adresă de transmitere tot adresa cana lului logic la care a
trimis pachetul inițial. (12)
3.2 Resurse Software Folosite
3.2.1 Arduino IDE
Arduino IDE este un mediu de dezvoltarea ușoară și rapidă de programe pentru plăcile de dezvoltare
Arduino. Acesta este de f apt un program gratuit care asigură o programare simplificată pentru
microcontrolerele Atmega.
Cu ajutorul programului Arduino IDE se pot scrie programe ușor ce pot fi încărcate prin intermediul
cablului USB pe microcon trolerul Atmega. După încărcarea codului pe microcontroler este apoi rulat de
acesta. Arduino IDE folosește o variație a limbajelor de programare C și C++. Înainte de a începe scrierea
de cod propriu -zis pe Arduino IDE trebuie selectate tipul de placă folo sit și portul serial prin c are este
realizată conexiunea. (13)
Un cod s cris în acest mediu de dezvoltare trebuie să res pecte niște reguli de sintaxă. Înainte de a începe
scrierea unui co d în Arduino IDE trebuie cunoscu te câteva noțiuni de bază:
• Codul scris în limbajul Arduino se numește sketch
• Un sketch Arduino se execută mereu de la cap la coadă
• Sketch -ul scris pentru Arduino conține cinci părți:
o La fel ca și în alte limbaje de programare codul trebuie să aibă un antet în care s ă se explice
pe scurt ce face sketch -ul respectiv
o Declararea variabilelor globale
o După declararea variabilelor urmează rutina setup (). În cad rul acestei funcții se vor seta
condițiile inițiale ale regiștrilor și se vor executa operații pe care dorim să le rulăm o
singură dată. Tot în cadrul acestei funcții este necesară și inițializarea comunic ației seriale
ce ne va fi folositoare la utilizarea monitorului serial din cadrul programului Arduino IDE.
o După realizarea funcț iei setup () urmează funcția loop() care este așa -zisa parte principală
a sketch -ului. În cadrul acestei funcții se găsește partea de cod cea mai importantă, aici
fiind practic tot algoritmul programului realizat. În momentul rulării unui sketch, odată ce
programul va ajunge în această buc lă o va executa continu u atâta timp cât sketch -ul va
rula.
o După funcția loop() vor fi scrise funcțiile specifice programul ui ce vor pute fi apoi
apelate î n funcția loop().
47
3.2.2 Sistemul de operare Raspbian
Acest sistem de operare este oferit gratuit și are l a bază sistemul de oper are Debian 7 “Wheezy”. Numele
său a fost obținut prin combinarea celor dou ă nume Raspberry și Debian (Rasp și bian).
Raspbian este special optimizat pentru a suporta setul de instrucțiuni al arhitecturii ARMv6 care stau la
baza minic alculatorului Raspberry Pi.
Prin folosirea acestui sistem de operare avem avantajul utilizării a peste 3500 de pachete software
gratuite , special create pentru el și optimizate pentru a rula pe hardware -ul ARM11 al acestui
minicalculator.
Acest sistem de o perare este unul de tip “hard -float”, adică oferă posibilitatea de a opera în vir gulă mobilă
prin emularea unui hardware. În cele mai recente distribuții ale sistemului de operare Raspbian cele mai
semnificative elemente necesare lui Debian Whee zy au fost mulate pe necesitățile arhitecturii ARMv6,
deși distribuția de baza necesită ARMv7. În acest fel a fost sporită performanța aplicațiilor ce folosesc
operații în virgulă mobilă , deoarece sistemele de operare precedente folosesc setări de tipul “soft – float”,
care s unt mai puțin eficiente, pentru că, în această configurație operațiile aritm etice ce funcționează în
virgulă mobilă pentru arhitectura ARMv6 sunt emulate software.
3.2.3 Conexiunea cu Raspberry PI
Există situații în care conexiunea la distanță es te o metodă mai simplă sau situații în care natura
proiectului impune o conexiune la distanță. Pentru a realiza o conexiun e la distanță prin intermediul
Internetului este necesară cunoașterea adresei IP a echipamentului pe care vrem să îl accesăm, a numelu i
de utilizator de pe acel echipament și a parolei.
În rețelele locale există două tipuri de alocare a adreselor IP, a locare statică și dinamică. Dacă alocarea
este statică este suficientă salvarea acelei adrese IP alocate prima dată și folosirea ei în con exiunea SSH.
Dacă alocarea se face dinamic atunci va fi nevoi e mereu de conectarea unui monitor ș i a unei tastaturi
pentru aflarea adresei IP alocate . Aflarea adresei IP se face deschizând o fereastră de terminal în care se
va executa comanda “Hostname -I”.
SSH – Secure SHell
SSH (Secure SHel l) reprezintă un protocol de reț ea criptografic care permite ca datele transferate să
beneficieze de un canal securizat. În cadrul acestei conexiuni orice informație trimisă către rețea este
automat criptată, iar când a junge la calculatorul de la destinație este decriptată tot automat. Acest lucru
poate fi văzut ca o criptare transparentă , întrucât utilizatorul nu e ste afec tat în nici un fel de aceas tă
operație de criptare, el putând să își desfă șoare activitatea în mod normal fără să știe că datele transmise
sunt criptate în timpul transmiterii în rețea.
48
Protocolul SSH asigură trei caracteristici principale: autentificarea, criptarea și integritatea datelor
transmise într -o conexiune.
1.Autentificare : este realizată o identificare precis ă a celui care inițiază conexiunea
2.Criptare: datel e sunt complet criptate astfel încâ t doar destinatarul autentificat le poate decripta
3.Integritate: garantează că datele care circulă in timpul conexiunii ajung nealterate
Conexiunea la Raspberry Pi prin intermediul protocolu lui SSH oferă posibilitatea rulă rii unei console de
terminal pe dispoz itivul respectiv. Această metodă este foarte rapidă în situația î n care utilizatorul
cunoa ște un limbaj de scr ipting precum bash necesar sistemului de operare Linux.
În situația în care utilizatorul folosește sistemul de operare Windows, pentru a folosi acest tip de
conexiune va avea nevoie de un program ce emulează un terminal fiind un client pentru SSH , spre
exemplu programul gratuit Putty, iar în situația în care utilizatorul folosește Linux, acesta vine de obicei
cu un astfel de program instalat implicit. (14)
VNC Connect
Această metodă de conexiune este foarte prietenoasă, punând la dispoziție o interfață grafică foart e
intuitivă. Folosind această metodă avem acces la întregul sistem de operare de pe Raspberry Pi, oferind
avantajul unei conexiuni prietenoase, acest mod de conectare es te foarte util utilizatorilor ca re nu sunt
familiarizați cu linia de comandă.
Pentru re alizarea unei conexiu ni de tipul acesta este nece sară cunoașterea adresei IP, a numelui de
utilizator și a parolei asociata acestuia.
Figura 3. 16 – PuTTY Figura 3. 17 – VNC Viewe r
49
3.2.4 Serverul Apache
Apache este un server de tip HTTP gratuit. Acest tip de server a jucat un rol major în dezvoltarea webului,
stând la baza a 65% din paginile web actuale.
Un astfel de server este foarte util și în cadrul aplicațiilor de IoT deoa rece poate fi rulat cu ușurință pe un
nod principal care are ca modul de procesar e un mi nicalculator precum Raspberry PI.
Serverul Apache poate deservi găzduirea interfeței grafice a unei aplicații IoT pr in intermediul căreia se
realiz ează comanda și monit orizarea acelui proiect. Interfața grafică poate fi realizată în HTML, iar partea
de programare, cât și transmiterea comenzilor către kernel pot fi realizate în limbajele de programare
PHP sau JavaScript.
3.2.5 Limbaje folosite
HTML este acronimul de la Hypertext Markup Language, ceea ce este de fapt limbajul pe care browserele
de Internet îl înțeleg și cu ajutorul lui pot fi afiș ate paginile web.
PHP este un limbaj de programare care ajută la cre area de pagini de Internet dinamice. Acesta se folosește
împreună cu limbajul HTML
Javastript (JS) este de asemenea un limbaj de programare orientat pe obiecte. Este foarte util în adăugarea
de funcționalități în paginile web, acest limbaj putând fi interpretat și de către browser.
Pentru a programa atât modulele de comunicare cât și modulele de procesare având în vedere
echipamentele fizice folosite precum microcontrolere Atmega sau minicalculatorul Raspberry PI am ales
limbajul de programare C ++. Acesta este un limbaj de programare standardizat care este foarte î ntâlnit
în cadrul proiectelor ce au la bază microcontrolere sau minicalculatoare de genul Raspberry PI.
50
51
Capitolul 4 – Realizarea practică
Realizarea practică a acestui proiect a presupus o serie de etape precum :
• Alegerea echipamentelor
• Alegerea topologiei de rețea
• Realizarea conexiunii între nodurile rețelei
• Alegerea canalului de comunicare pentru evitarea interferenței
• Realizarea interfeței grafice pentru monitorizare și control
În figura de mai jos este ilustrată arhitectura sistemului realizat.
Figura 4. 1 – Arhitectura generală a sistemului realizat
În cadrul acestui capitol se vor prezenta aceste etape ce au stat la baza realizării unui sistem de achiziție
de date și de control al unei lo cuințe.
4.1 Proiectarea rețelei de comunicație fără fir
Pentru un proiect ce are ca scop realizarea unei rețele de senzori f ără fir sunt necesare două compo nente
principale.
Prima componentă este nodul de rețea ce va deservi ca și nod principal al rețele i. Acesta va trebui să aibă
pe lâ ngă modulul de comunicare un modul de procesare , capabil să ruleze un server , care va trebui să
găzduiască interfața grafică cu utilizatorul. Pentru aceasta nodul principal trebuie să asigure conexiun ea
52
la Internet. Pentru realizare a nodul ui de rețea principal am ales folosirea unui minicalculator Raspberry
PI Zero W ce a fost prezentat în capitolul 3.
A doua componentă ce stă la baza realizării unei rețele fără fir este nodul propriu -zis, cel care are integrată
unitatea de comandă sau senzorii. La nivelul a cestei componente se va face achiziția de date din mediul
exterior și se vor lua anumite decizii în privința unor comenzi . Pentru a realiz a aceste o perații nodul
trebuie să dispună de pini de intrare analogici , pentru a pu tea prelua date de la senzori ,cât și de un
convertor analog -digital , pentru a asigura convertirea datelo r analogice venite din mediul ex terior. Având
în considerare aceste aspecte, am ales folosirea unei plăci de dezvoltare Arduino ce are la bază un
microcontroler Atmega328p. Alegerea acestei plăci de dezvoltare a fost făcuta datorită avantaje lor pe
care le aduce. Pe lângă programatul facil , acest mediu de programare beneficia ză de foarte multă
documentație și exemple pe Internet.
În cadrul acestui proiec t se va realiza o rețea de senzori fără fir ce sunt c apabili să m ăsoare temperatura
și umiditatea aerului din mediul înconjurător. Aceste noduri vor prelua datele pe care le vor comunica
prin radiofrecvență nodul ui principal. La nivelul nodului principal s e vor procesa datele și se vor
centraliza la nivelul unei interfețe grafice prietenoase. De la nivelul interfeței grafice , pe lâ ngă
monitorizarea datelor venite de la senzori , se vor putea da și niște comenzi care să ofere controlul
anumitor echipamente el ectronice auxiliare unei locuințe. Controlul se va realiza prin folosirea unor
relee.
Exista două modalități de control:
• prima fiind prin comandare a locală a unui pin de pe placa Raspbbery PI ;
• a doua este de a comanda un pin prin intermediul unei comenzi t rimise prin radiofrecvență către
un nod de control fără fir.
Pentru a asigura comu nicarea toate nodurile rețelei trebuie să aibă în componența lor modulele de
comun icare nRF24L01+. Acestea asigură o comunicație de tip stea în care un nod principal poate să
comunice cu șase noduri secundare simultan. Având în ved ere că suprafața de acoperire câ t și numă rul
de noduri sunt mici am ales folosirea topologiei de rețea de tip stea pentru realizarea acestui proiect .
Rezultatul practic se poate observa în figura de mai jos.
Figura 4. 2 – Macheta experimentală
53
4.2 Realizarea comunicației între nodurile rețelei
Funcțiile principale
Pentru a realiza comunicarea î ntre două noduri de rețea trebu ie asigurate niște etape de pregătire ale
cipului de c omunicare nRF24L01+.
Program area, atât a nodului principal câ t și a nodurilor secundare , a fost realizată utilizându -se librăria
C dezvoltată de TMRh20 încă din anul 2014. Am ales folosirea acestei librării întrucât este foarte bine
documentată , conține t oate funcțiile ce asigură comunicația SPI între modulul de procesare și modulul
de comunicare, cât și funcțiile necesare pro gramării cipului de comunicare. Prin intermediul acestei
librării se realize ază programarea regiș trilor modulului de comunicație într-un mod prietenos și optim.
Etapele realizării unei comunică ri între noduri sunt următoarele:
• Asigurarea comunicației SPI între modulul de comandă și integratul nRF24L01+
• Realizarea configurării cipului de comunicare
• Setarea canalului de comunicare
• Select area ratei de biți
• Selectarea canalelor de comunicare logice atât pentru transmitere cât și pentru recepție
• Ascultare a mediului exterior în vederea recepționării unor pachete de la nodurile rețelei sau
transmiterea de pachete către alte noduri ale rețelei.
Structura generală a unui program scris în limbajul Arduino este constituită din două părți principale
void_setup() și void_loop() .
În cadrul funcției void_setup() se vor realiza toate inițializările microcontrolerului, iar în funcția
void_ loop() se va s crie programu l ce va fi executat într -o buclă .
În vederea asigurării unei comunicări corecte între nodurile unei rețele fără fir, pe fiecare dintre noduri
vor trebui asigurate unele inițial izări și configurări de regiștrii . Mai jos vor fi prezentate câteva din
funcțiile principale ce stau la baza unei inițializări corecte ale cipului de comunicare.
• Funcția de inițializare generală
Pregătirea cipului pentru a începe comunicarea se face cu ajutorul funcției radio.begin(). Această funcție
se va apela la începu tul funcției principale void_setup() .
În cadr ul acestei funcții se va realiza comunic ația serială SPI între integrat și modulul de comandă.
Aceasta v a asigura pornirea procesului de configu rare corect setând anumiți regiș trii la niște valori
implicite ca re să fie valabile pentru cele mai multe platforme hardware precum rata de biți la 1 Mbps.
Tot la nivelul acestei funcții se va dezactiva și alocarea dinamică a dimensiunii pachetelor setând la 0
logic registrul DYNPD. Este foarte important ca la inițializ are să se seteze un canal de comunicație al
cărei frecvențe să fie liberă î n toate țările. P entru aceasta în cad rul acestei funcții se va se ta canalul de
comunicare la numă rul 76.
54
• Funcția de deschidere a canale lor logice de citire
După inițializare este n ecesară și deschiderea canalelor logice de comunicare. Acest lucru se va face
folosindu -ne de conceptul de pipe-uri (canale de comunicație logice).
Se pot deschide două tipuri de canale de comun icare :de scriere și de citire. Pentru a deschide un astfel
de canal de comunicare logic de citire se va apela funcția : openReadingPipe(uint8_t numar, const uint8_t
* adresa)
Se observă că această funcție se apelează prin doi p arametri : primul reprezintă numă rul canalu lui logic
pe 8 biți, iar al doi lea este repreze ntat de un pointer și reprezintă adresa canalului respectiv.
Șase astfel de canale logice pot fi deschise simultan. Convențional s -a stabilit ca pipe -ul 0 să fie folosit
pentru scriere, iar restul să fie folosite pentru citire.
• Funcția de deschidere a cana lelor logice de scriere
Pentru a deschide un canal logic de scriere se va folosi o funcție specială care are urmă torul antet:
openWritingPipe(const uint8_t * address)
Pe un nod de comunicare nu pot fi deschise mai multe canale de scriere , spre deosebire de canalele de
citire ce pot fi în numă r de 5.
Se observă că această funcție este apelată doar prin intermediul unei adrese. De menționat este ca această
adresă de scriere trebuie să coincidă cu una d in adresele de citire de pe celă lalt dispozitiv în vedere a
realizării unei comunicații.
• Funcția de setare a canalului de comunicare
Setarea canalului de comunicar e este o etapă foarte importantă , dacă ne dormi să realizăm o comunicare
între două nodu ri. Acest integrat de comunicare fără fir suportă până la 126 d e canale fizice de
comunicare .
Pentru setarea canalului de comunicare se va folosi funcția set.Channel (unit8_t canal) ce va fi apelată
prin i ntermediul numă rului efectiv al ca nalului de comunicare dorit. Numă rul canalului dorit va fi scris
în cadrul acest ei funcții în registrul RF_CH.
• Funcția de setare a nivelului puterii de emisie
După alegerea canalului urmează alegerea niv elului puterii de tr ansmisiune. Acest integrat suportă 4
niveluri de amplificare ce sunt ilustrate în tabelul de mai jos.
RF_SETUP(RF _PWR) Puterea de ieșire Consumul de curent
11 0 dBm 11.3 mA
10 -6 dBm 9.0mA
01 -12 dBm 7.5 mA
00 -18 dBm 7.0 mA
Tabel 4. 1 – Niveluri de amplificare
55
Antetul funcției ce realizează setarea ni velului de amplificare este urmă torul: setPALevel(uint8_t nivel ).
Nivelul este setat în cad rul funcției prin setarea biților RF_PWR din cadrul registrului RF_SETUP așa
cum se vede în tabelul de mai sus. Funcția es te apelată printr -o variabilă pe 8 biți ce constituie chiar
nivelul dorit.
• Funcția de setare a ratei de biți
Pentru setarea ratei de biți în v ederea comunicării este necesară alegerea uneia dintre cele trei posibilități
puse la dispoziție de acest integrat. Acestea sunt de 250 kbps, 1 Mbps și 2 Mbps.
Antetul funcției în cadrul că reia se face setarea acestei rate de biți este : setDataRate(rf24_datarate_e
speed) .
Se poate observa că această funcție este apelată prin intermediul unei variabile cu tip abstract definit ce
reprezintă chiar una din cele trei rate binare disponibile. În c adrul acestei funcții se realizează setarea
bitului RF_DR din registrul RF_SETUP.
În alegere a unei rate de bit trebuiesc lua te în considerare faptul că o rată binară mică față de una mare
este foarte utilă în cazul în care se dorește o sensibilitate mare l a recepție, dar , pe de altă parte , o rată
binară mare ajută la un consum mai redus de putere și reduce de asemenea și riscul de coliziune între
pachete.
Pentru ca două noduri să comunice este foarte important să folosească pe lângă același canal și aceeași
rată de bit.
• Funcția de retrimitere
Există uneori situații în care pachetul transmis nu este recepționat de receptor din diverse motive precum
coliziunea între pachete la recepție sau ecranarea temporară a căii de comunicare.
Pentru a asigura o transmisi une sigură este foarte util un mecanism care să asigure retransmiterea unui
mesaj până când se primește un mesaj de înști ințare afirmativ sau până câ nd un numă r de retransmiteri a
fost fă cut. Această funcție se găsește în librăria RF24.h și are următorul a ntet: setRetries(uint8_t delay,
uint8_t count).
Această funcție se apelează prin două variabile delay și count. Delay reprezintă timpul dintre do uă
retrimiteri consecutive. Ace astă variabilă poate lua ca valoare p ână la 15 m ultiplii ale valorii 250 us, 0
însemnând de fap t 250 us, iar 15 4000 us. A doua variabilă prin care este apelată funcția reprezintă
numărul de retrimiteri efectiv, acest a putând lua valori de la 0 până la maxim 15.
56
4.2.1 Nodul senzor
Așa cum am prezentat în Capitolul 3, cipu l nRF24L 01+ dispune de comunica ție SPI. Conexiunea dintre
cipul de comunicație și modulul de procesare se face asemănător cu imaginea de mai jos.
Figura 4. 3 – Conexiune Arduino Nano – nRF24L01+
Modulul de procesare al datelor ales este Ardu ino Nano ce are la bază microcontrolerul Atmega 328p.
Pinii au fost conectați în conformitate cu tabelul de mai jos:
Tabel 4. 2 – Conectarea pinilor Arduino Nano – nRF24L01+
Modulul radio nRF34L01+ lucrează pe interfa ța SPI la tensiune de 3v3. Totuși, acesta are integrată o
logică ce este compatibilă cu tensiuni de 5V, ceea ce asigură interfața rea acestuia cu dispozitive care
lucrează la nivelur i logice de 5V.
Pinii
Modulului Descriere Arduino
Nano
1 GND GND
2 VCC 3.3V
3 CE DIO8
4 CSN DIO7
5 SCK DIO13
6 MOSI DIO11
7 MISO DIO12
8 IRQ NOT
57
Consumul de curent al modulul ui radio nRF24L 01+ poate atinge valori de vârf de p ână la 150mA. Acest
curent este de așteptat atunci câ nd acesta trans mite proces electric ce necesită un consum crescut de
energie în ori ce dispozitiv de radio frecvență .
Soluția pentru a asigura a cest curent de vârf care durează câteva fracțiuni de secundă este de a plasa în
layout -ul circuitului un condensator de 10uF între linia de VSS și GN D a modululu i radio. Această
opțiune a sigură o componentă pasivă care este mereu încă rcată cu sarcină și gata să furnizeze această
sarcină dispozitivului radio at unci câ nd acesta are nevoie de ea, în speță în momentele de co nsum maxim
de curent când sursa de alimentar e de VCC nu poate furniza atât de repede tot curentul necesar modulului.
Singura condiție este c a acest condensator să fie poziționat cât ma i aproape de consumatorul să u, în cauză
modulul radio nRF24L01+ , deoarece as tfel efect ul acesta de a răspunde reped e în timp se pierde pe
traseele cir cuitului electronic.
Programul care rulează pe acest nod este unul scris în limbajul Arduino care respec tă formatul clasic cu
două funcții principale: void_setup() și void_loo p().
În funcția void_setup() s-au realizat toat e inițializările:
• Realizarea conexiunii SPI între cele două module
• Setarea canalului de comunicare
• Setarea nivelului puterii de emisie
• Setarea ratei de biți
• Activarea pachetelor d e confirmare (ACK)
• Setarea numă rului de retrimiteri și a intervalului de timp dintre acestea
• Trecerea cipului în modul pornit
În cadrul funcției loop(void) se vor realiza deschiderea de canale logice de transmitere, preluarea
parametrilor temperatură și umiditate din mediul înconjurător folosind un senzor de temperatură.
În cad rul acestui proiect se vor achiziționa date de la două noduri cu senzori din locaț ii diferite, deci vor
fi necesari doi senzori de temperatură. Pentru aceasta am ales folosir ea a doi senzori unul fii nd AM2320,
iar cel de -al doilea fiin d DHT11 .
Conexiunea fizi că între cei doi senzori și Arduino Nano este ilustrată în tabelele de mai jos.
Tabel 4. 3 – Conectarea pinilor pentru DHT11 și AM2320
Datele preluate de la senzor se vor atribui unei variabile cu tipul de date abstract definit ce conține două
variabile float corespunzătoare celor doi parametrii. După toate acestea , variabila cu tipul definit va fi
transmisă pe un canal de comunicație logic. Operațiile pe care le execută nodul senzor sunt explicate pe
scurt în organigrama de mai jos.
58
Figura 4. 4 – Structura programului de pe nodul cu senzor
59
4.2.2 Nodul de control
Nodul de control respectă aceeași conexiune hardware ca și nodul senzor. Diferențele dintre acestea două
sunt că nodul senzor re alizează transmit erea de date la nodul principal, iar acesta recepționează da te de
la nodul principal.
Figura 4. 5 – Structura nodului principal
La nivelul nodului principal se face citirea din fișierul text a parametrului introdus de la interfața g rafică.
Acest parametru reprezintă de fapt temperatura dorită în locuință. De la nivelul nodului principal am ales
transmiterea unui simbol sau a unei secvențe de simboluri care să ne indice modul în care dorim să
acționăm asupra releelor . Dacă nodul prime ște secvența “999” atunci va scrie 1 logic la pinul 1 ceea ce
va duce la deschiderea releului, deci va decupla alimentarea electrică. Dacă se va primi simbolul “3”,
înseamnă că temperatura introdusă este mai mică decât cea măsurată, deci pinul 1 va fi seta t tot la 1 logic ,
iar dacă se va primi caracterul “4” atunci înseamnă ca temperatura introdusă este mai mare decât cea
măsurată deci se va dori pornirea releului, atunci se va scrie 0 logic la pinul 1.
Similar se va realiza și controlul pinului 2, structur a programului care rulează pe nodul de control poate
fi observată în organigrama de mai jos:
60
Figura 4. 6 – Structura programului de pe nodul de control
61
4.2.3 Nodul principal
Figura 4. 7 – Conexiune Raspberry PI – nRF24L01+
Pentru realizarea nodului principal am ales folosirea minicalculatorului Raspberry PI Zero W.
Pentru realizarea programului de conexiune în rețeaua fără fir am folosit limbajul de programare C sub
sistemul de operare Linux.
Așa cum se poate vedea în imaginea de mai jos, nodul principal, este realizat folosindu -se două niveluri.
La baza primului nivel stă programul care realizează conexiunea cu modulu l radio nRF24L01+ și care
execută centralizarea datelor în fi șiere text.
Figura 4. 8 – Nivelurile nodului principal
Al doilea nive l conține partea de server ce gă zduiește interfața grafică la nivelul căreia se face
monitorizarea și controlul.
Programul ce stă la baza realizării comunicației între nodul principal și restul rețelei a fost realizat în
limbajul de programare C++ pentru care am folosit librăria realizată de TMRh20. Documentația sub
VCC 3.3V
GND GND
CSN GPIO08
CE GPIO17
MOSI GPIO10
MISO GPIO09
SCK GPIO11
IRQ NEC.
62
forma de Doxyfile . (15) Această librărie reprezintă un driver foarte bine optimizat pentru cipul
nRF24L01+.
În antetul programului nod_principal.cpp de pe nivelul principal se observă patru secțiuni. În prima
secțiune sunt incluse librăriile necesare realizării progra mului.
A doua secțiune este cea de variabile globale unde se vor defini variabile ce ajută la extragerea
informațiilor din fiș ierele text, pointerii cu care se vor parcurge fișierele text și pipe -urile de comunicare.
Pentru declararea pipeuri -lor de comun icare s -au folosit niște adrese hexazecimale ce vor fi stocate într –
un vector de 6 elemente.
Pentru definirea structurii pachetului recepționat, având în vedere că datele venite de la nodurile senzori
sunt o temperatură și o umiditate , s-a definit un tip a bstract de date care să conțină două variabile de tip
float.
În func ția principală este realizat practic tot algoritmul de comunicare. În cadrul acestei funcții se vor
efectua următoarele etape:
• Se ap elează funcția care realizează inițializarea cipului rad io: radio_init().
Această funcție realizează inițializarea comunicației SPI, setează canalul de comunicație, nivelul puterii
de emisie, rata de biți, dacă dorim sau nu pachet de confirmare , dacă dorim să ret rimitem de un anumit
număr de ori un pachet, prec um și afișarea în linia de comandă a detaliilor de conexiune pentru a verifica
corectitudinea conexiunii precum în imag inea de mai jos.
Figura 4. 9 – Detalii de conexiune
63
• Se vor deschide canalele logice de comunicare pentru rece pția și transmisia datelor.
Această funcție conține instrucțiu ni care realizează deschiderea unui can al logic de comunicare pentru
scriere și a 5 canale logice pentru citire.
• Într-o buclă infinită se vor realiza transmiterea de comenzi și recepția de date.
Folosind funcția input_param() se vor prelua datele introduse prin intermediul interfeței grafice. Datele
introduse de către utilizator prin interfața g rafică sunt stocate într -un fiș ier text. Această funcție realizează
citirea unui parametru și stocarea sa într-o variabilă dintr -un fișier text.
După citirea acestui parametru , care este temperatura propriu -zisă pe care o dorim în locuință , se va
executa funcția condition() , care va face compararea acestui param etru cu temperatura existentă citită de
la un nod senzor din rețea. În funcție de rezultatul comparației se vor lua niște hotărâri în vederea
transmiterii unui cod unic corespunzător unei comenzi la un nod ce va executa controlul unui releu pentru
pornirea și stingerea unei centrale termice.
Cu cele prezentate mai sus am asigurat controlul unei centrale termice având ca reper o temperatură pe
care o primim de la un nod senzor din locuință. Pentru recepționarea acelei temperaturi de la nodul senzor
trebuie ca în bucla principală să fie făcută și prelua rea datelor de la nodurile cu senzori. Pentru acest lucru
se va trece cipul de comunicare în modul de recepție folosindu -se funcția startListening(), iar apoi se va
apela funcția receptie(). În cadrul acestei funcții se vor asculta toate canalele logice de comunicare ș i
atunci câ nd sunt date de recepționat acestea vor fi salvate într -un fișier text. Tot în cadrul acestei funcții
sunt realizate și niște afișări în linia de comandă a informaț iilor recepționate , cât și a numă rului de canal
logic de pe care s -a realizat recepția. După ce a fost scris programul acesta a fost compilat folosindu -se
compilatorul g++, rularea sa făcâ ndu-se clasic, f olosind comanda sudo ./numeprogram.
Princip iul de funcționare al acestui nod este reprezentat și în organigrama de mai j os.
64
Figura 4. 10 – Principiul de funcționare al nodului principal
65
Instalarea și configurarea serverului
La nivelul nodului principal , așa cum s -a prezentat și mai sus , vom rula un serve r Apache care este
capabil să gă zduiască inter fața grafică web ce va putea fi accesată din interiorul rețelei locale.
În cazul proiectului de față , pentru a folosi cât mai optim resursele acestuia , am ales folosirea unui sistem
de operare care nu dispune de interfață grafică. D e aceea , toata configura rea se va face din linia de
comandă. Modul de configurare va fi explicat în cele ce urmează. Înainte de orice operație trebuie
asigurată conexiunea la Internet a minicalculatorului Raspberry PI.
Pentru a realiza acest lucru trebuie configurat manual un fiș ier, la nivelul căruia se stochează numele
routerului folosit (SSID) și parola acestuia (PSK). Pentru a ajunge la acest fișier s e va executa în linia de
comandă instrucțiunea: cd /etc/wpa_supplicant , după deschiderea acestui director se va edita cu ajutoru l
unui editor de text precum nano fișierul de configurare wpa_supplicant.conf folosind comanda: sudo
nano wpa_supplicant.conf . După deschiderea acestui fiș ier va trebui scris manual nume le routerului și
parola acestuia .
Având în vedere că nodul principal este un minicalculator Raspberry Pi ce are ca sistem de operare o
distribuție Linux specială pentru acest di spozitiv , numită Raspbian , am urmă rit urmă toarele etape pentru
a instala serverul Apache:
-În primul rând va trebui realizată o reînnoire a pachetel or existente în baza de date a Linux -ului, pentru
a beneficia de ultimele versiu ni de aplicații existente. Acest lucru se face folosind comanda: sudo apt –
get update ;
-După actualizarea listei de aplicații urmează instalarea propriu -zisă. Instalarea serveru lui Apache este
făcută executâ nd în linia de comandă a comenzii: sudo apt -get install apache2 .
-Apoi pentru verificarea instală rii se va deschide într -un browser o pagină folosind adresa locală a
dispozitivului ce gă zduieș te serverul. Pentru aflarea adrese i locale se va introduce î n linia de comandă
instrucțiunea : hostname -I. Dacă instalarea a fost făcută cu succes va trebui să se deschidă o pagin ă care
să confirme acest lucru.
-Calea către fișierul ce găzduiește interfața grafică este: " /var/www/html ". Ai ci, dacă executăm comanda
de listare " ls -l" vom identifica pagina princi pală care are numele index.html .
Realizarea interfeței grafice
Pentru a asigura o metodă ușoară de vizualizare a datelor preluate de la senzori și pentru a asigura
controlul am creat o interfață grafică HTTP. Aceasta poate fi accesată local atunci când atât dispozitivul
de pe care se face controlul cât și nodul principal sunt conectate în aceeași rețea. Interfața grafică poate
fi vizualizată în figura 4.6.
66
Figura 4. 11 – Interfața grafică
Această interfață grafică a fost realizată cu ajutorul limbajului HTML îmbinat cu CSS, PHP și JavaScript.
Se observă că acesta interfață grafică asigură monitorizarea indicând , în niște casete de text portocalii ,
datele venit e de la nodurile cu senzori. Pe lângă datele venite de la senzori se oferă și posibilitatea
controlului prin intermediul unor butoane sau a unor casete de text în care se introduc parametrii doriți.
Aspectele plă cute ale butoanelor, casetelor în care sunt afișați parametrii sau caseta în care sunt introduși
parametrii , au fost realizate folosindu -se limbajul CSS. Prin intermediul acestui limbaj am realizat
dimensionarea, aranjarea în pagină cât și colorarea acestora pentru un aspect mai plăcut.
Pentru monit orizare am constat at că, datorită faptului că datele de la nod urile secundare vin în continuu ,
dacă se realizează o simplă afișare a acestora în interfața grafică , acestea nu se vor actualiza decât după
ce vom reîmprospăta pagina WEB. Pentru a realiza o re împrospătare locală, doar pe conținutul acelor
casete de t ext, am realizat niște funcții î n JavaScrip care să realizeze actualizarea la intervale de o
secundă.
Realizarea controlului
Așa cum am spus mai sus se pot realiza două tipuri de control:
• Control local
• Control prin radiofrecvență
67
Controlul lo cal
Pentru controlul local am creat niște butoane căro ra le-am aplicat un stil realizat în CSS care se numesc
sugestiv .button{} . La apăsarea unui buton acesta își schimbă starea, iar noua stare este trimisă c ătre un
script realizat în php. Acest script verifică starea butonului și în funcție de ace asta va trimite o comandă
către kernelul de Linux folosind funcția shell_exec() , care va activa sau va dezactiva un pin GPIO de pe
Raspberry PI.
Pentru a realiza un control în timp al acestor stări , am folosit o pictogramă între butoane care își schimbă
culoarea. Atunci când pinul este activat devine verde, iar atunci când este dezactivat iconița devine roșie.
Deoarece la fiecare apăsare de buton sau reactualizare a p aginii stare a butonului revenea la cea inițiala ,
am ales f olosirea unui f ișier text în care să suprascriu starea curentă la fiecare apăsare de buton , pentru a
simula astfel o variabilă non volatilă ce stochează starea , și anume salvarea stării butonului. P entru a
folosi această metodă a f ost n ecesară crearea unui număr de fișiere text egal cu numă rul de butoane.
Se observă ca între butoane există o iconiță. A ceasta va fi folosită pentru cele două st ări ale butoanelor,
pornit și oprit. Pentru cele două stări am realizat în CSS dou ă stiluri diferite , unul de culoare roșie și unul
verde icon_red{} și icon_green{} . Atunci când un buton este apăsat starea acestuia e ste stocată într -un
fișier text, iar î n funcție de această stare se va face o verificare în cad rul unui script php unde se va lua
deciz ia colorării iconiței. D acă a fost apă sat butonul de pornit se va aplica stilul cu culoare verde, iar dacă
se va apăsa butonul de op rit, iconiței i se va aplica sti lul cu culoare a roșie.
Control prin radiofrecvență
Pentru realizarea co ntrolului prin radiofrecvență a fost necesară comun icarea între interfața grafică ș i
softul care realizează centralizarea datelor. În primul rând am realizat o casetă de text în care atunci când
se introduc date acestea sunt salvate într -un fișier text pe server . Fișierul text este deschis și citit în
cadrul programului principal scris în C++ , iar conținutul său este stocat într -o variabilă locală. Aceas tă
variabilă va fi comparată cu temperatura preluată de la nodul senzor din casă și se vor lua două decizii:
dacă temperatura este mai mare decât cea măsurată se va transmite simbolul “3” către nodul ce realizează
controlul, iar dacă temperatura este mai mică decât cea măsurat ă se va transmite secvența “4” către nodul
de control. Dacă se dore ște oprire a definitivă a releului conectat la nodul de control se va transmite
secve nța “999”.
Pe lângă controlul în funcție de un parametru introdus de utilizator, acest program mai asigură și controlul
unui releu conectat la un pin GPIO la apăsarea unui buton pe interfața grafică. În interfața grafică am
definit un 2 butoane care la apăsare schimbă o variabil ă într -un fișier text. Atunci câ nd butonul de pornit
este apăsat variabila din fișier se va schimba la 1 logic, iar când butonul de pornit va fi apă sat variabila
din acel fișier va fi schimbată. Pentru a se realiza controlul prin radio -frecvență, similar se va aborda un
algoritm similar ca cel de mai sus, în care datele din acest fișier vor fi stocate într -o variabilă și transmise
prin radio -frecvenț ă la nodul de control.
68
4.3 Alegerea canalului de comunicare
Pentru a asigura o conexiune bună între nodurile rețelei wireless este foarte importantă aleg erea canalului
de comunicație radio pe care rețeaua va trimite pachetele. Este foarte important ca două noduri care
doresc să comunice să folosească același canal de comunicare. Pentru aleger ea canalului de comunicare
s-a folosit un program care efectuează o cerceta re a fiecărui canal în vederea analizei numărului de
purtătoare existente pe acel canal într-un interval de timp explorat anterior . Astfel , am putut determina
un canal optim , pentru a realiza o comunicație fără interferențe și fără coliziuni între pachete.
Programul a f ost realizat în C++ și rulat sub sistemul de operare Linux pe Raspberry PI. Acesta are
structura din organigrama de mai jos:
Figura 4. 12 – Algoritm alegere canal de comunicație
La baza acestui prog ram stă funcția de verificare a numărului de purtătoare pe fiecare ca nal de
comunicare. Această funcț ie este numită sugestiv scanare(). În cad rul aceste i funcții se realizează
parcurgerea fiecărui canal de comunicare, trecerea cipului în modul de recepție pentru 128 de
microsecunde pentru a verifica gradul de ocupare, apoi t recer ea modulului de comunicare î n modu l oprit.
69
După ce am ținut cipul î n modul de recepț ie pentru 128 de microsecunde se va executa verificarea
numărul ui de purtătoare de pe acel canal folosind funcț ia testCarrier(). Această funcție verifică gradul
de ocupare de pe un cana l de comunicație .
Programul a fost compilat folosind compilatorul g++. După rulare el va afișa în linia de comandă niș te
date ca în figura de mai jos:
Figura 4. 13 – Rezultatul rulării programului de scanare
Încadrat cu roșu este evidențiat, de sus în jos, gradul de ocupare de pe un canal la mai multe momente de
timp. În momentul efectuării măsurătorii am activat funcția Bluetooth pe telefonul mobil și s e poate
observa , încadrat cu galben , că în momentul pornirii acestei funcții gradul de ocupare al uno r can ale a
crescut foarte mult , întrucât această comunicație se realizeaz ă în banda dintre 2.4 și 2.48 GH z.
Pentru a observa mai ușor aceste date am realizat un program în M atlab în care sunt evidențiate grafic
gradele de ocupare ale canalelor (figura 4.9 ). Programul are ca date de int rare acele valori pe car e le
returnează program ul de scan are. Se poate observa î n imaginea de mai jos gradul de ocupare pe fiecare
canal. Ce l mai mare grad de ocupare detectat este pe canalul 24 și folosindu -ne de formula de calcul a
frecvenței canalului F = 2400 kHz + RF_CH (MHz) constatăm că frecvența canalului cel mai ocupat
este 2424 MHz care este în banda Bluetooth deci presupunerea de mai sus este confirmată.
Pentru realizarea acestui proiect am ales folosirea canalului 1 întrucât gradul de ocupare pe acel canal
este satisfăcător.
70
Figura 4. 14 – Numărul de purtătoare într -un interval de timp pe un anumit canal
71
Concluzii și contribuția personală
Scopul acestei lucrări a fost realiz area unui sistem de monitorizare și de control al echipamentelor
electronice auxiliare unei locuințe folosindu -se o rețea de noduri fără fir care să faciliteze efortul uman.
Conexiunea dintre nodurile rețelei a fost realizată cu ajutorul modulelor de comu nicație nRF24L01+,
care s -au dovedit a fi potrivite acestei aplicații. Acestea funcționează în banda dintre fre cvențele 2400
MHz și 2525 MHz și o feră posibilitatea comunicării prin intermediul a 126 de canale radio la trei rate de
biți de 250kbps, 1Mbps și 2Mbps .
Dezvoltarea acestui sistem a presupus atât asigurare a conexiunii rețelei fără fir, cât și realizarea unei
interfe țe grafic e prin intermediul căreia un utilizator să poată interacționa într -un mod prietenos cu acesta
în vederea realizării monitoriză rii și controlului.
Rețeaua este formată din trei componente principale și anume nodul principal, nodul de monitorizare și
nodul de control. La nivelul nodului principal se centralizează datele și se transmit comenzile c ătre nodul
de control. N odurile de m onitorizare realizează achiziția de temperatură și umiditate din med iul
înconjurător și le transmit prin intermediul radio -frecvenței către nodul principal, iar nodul de control
primește niște mesaje de la nodul princip al și în funcție de acestea va lua decizii în vederea activării sau
dezactivării unor relee conectate la pinii de ieșire.
Pe lângă controlul prin radiofrecvență am realizat și un control prin conexiunea WiFi. Acest control are
la bază niște comenzi locale ce sunt date prin intermediul unui s cript ce rulează la nivelul interfeței
grafice. Aceste comenzi sunt trimise către Shell în Linux și vor activa sau dezactiva niște pini de pe nodul
principal în vederea comandării unor relee.
Pentru realizarea acestei lucrări am folosit tehnologii noi prec um limbajele de formatare HTML,CSS,
am realizat funcții pentru actualizarea datelor de la nivelul interfeței grafice în Java Script și am realizat
comenzi către Shell, citiri și scrieri de fișiere folosind PHP. Pentru programul de pe nodul principal am
utilizat limbajul de programare C++.
Contribuția personală este vizibilă pe t ot parcursul realizării proiectului , atât în dezvoltarea programelor
ce asigură comunicarea dintre nodurile de rețea, cât și în realizarea interfeței grafice .
În concluzie acest proi ect și -a atins scopul, întrucât este capabil atât de realizarea controlului cât și de
monitorizarea mediului înconjurător. Principalul avantaj pe care îl aduce un astfel de sistem este sporir ea
confortului în locui nțe, întrucât atât monitorizarea cât și co ntrolul se realizează de la nivelul unei interfețe
grafice prietenoase. Un alt avantaj al acestui sistem este scalabiliatea rețelei, întrucât este foarte ușoară
agregarea la sistem a unui nou nod care să realizeze controlul unor echipamente electronice sau
monitorizarea mediului.
72
73
Bibliografie
1. Hype Cycle for the Internet of Things, https://www.gartner.com/doc/3770369/hype -cycle -internet –
things – , accesat la: 21.04.2018.
2. Perera C., “Sensing as a service model for smart cities su pported by Internet of Things”, în
Transactions on Emerging Telecommunications Technologies, vol. 25, no. 1, 2014, pp. 81 -93.
3. Abid Rahim, “Design and Implementation of a Low Cost Wireless Sensor Network using Arduino and
nRF24L01(+)”, în International Journal of Scientific Research Engineering & Technology (IJSRET),
Volumul 5, nr 5, Mai 2016.
4. Dumitrache I., Ingineria reglării automate, Editura Politehnica Press, 2005.
5. Introducere în Microcontrollere, http://andrei.clubcisco.ro/cursuri/3pm/lab1.p df , accesat la:
18.05.2018.
6. Laborator microcontrolere. Platformă cursuri , http://andrei.clubcisco.ro/cursuri/3pm/lab1.pdf,
accesat la: 04.05.2018.
7. Microcontrolerul , http://retele.elth.ucv.ro/Bratu%20Cristian/MAP/001%20 -%20Curs%20001%20 –
%20MAP%20 -%20Microcontrolerul.pdf , accesat la: 06.05.2018.
8. P. Aradi, “Offline and online thermostat experiment with Lab VIEW and Arduino \ Analysis and
evaluation of implementation based on user responses,” în International symposium on small scale
Intelligent M anufacturing Systems, pp. 127 –131, Iunie 2016.
9. DHT11, DHT22 and AM2302 Sensors, https://cdn -learn.adafruit.com/downloads/pdf/dht.pdf , accesat
la: 10.06.2018.
10. Digital Temperature and Humidity Sensor,
http://akizukidenshi.com/download/ds/aosong/AM2 320.pdf, accesat la 14.06.2018.
11. Laboratorul 6 – Serial Peripheral Interface , http://cs.curs.pub.ro/wiki/pm/pm/lab/lab6 , accesat la:
24.05.2018.
12. Datasheet nRF24L01+ ,
https://www.sparkfun.com/datasheets/Components/SMD/nRF24L01Pluss_Preliminary_Pro duct_Specif
ication_v1_0.pdf , accesat la 15.05.2018.
13. Intro to Arduino, http://www.instructables.com/id/Intro -to-Arduino/?ALLSTEPS , accesat la:
28.05.2018.
14. Laboratorul 6 – Serial Peripheral Interface, http://cs.curs.pub.ro/wiki/pm/pm/lab/lab6 , a ccesat la:
24.05.2018.
15. Optimized High Speed NRF24L01+ , http://tmrh20.github.io/RF24/ , acces at la: 02.06.2018.
74
75
Anexă
Anexa 1 – Programe le de pe nodurile rețelei
Program de pe nodul principal
#include <cstdlib>
#include <iostream>
#include <RF24/RF24.h>
using namespace std;
float in;
const uint64_t pipes[6] = { 0xF0F0F0F0D2LL,
0xF0F0F0F0E1LL,
0xF0F0F0F0E2LL, 0xF0F0F0F0E3LL,
0xF0F0F0F0F1, 0xE7E7E7E700LL};
FILE *f;
FILE *f2;
FILE *f3;
FILE *f4;
FILE *f5;
FILE *f6;
float a;
float temperatura;
float buton;
struct pachet
{
float temp;
float hum;
} p;
RF24 radio(RPI_V2_GPIO_P1_15, RPI_V2_GPIO_P1_24,
BCM2835_SPI_SPEED_8MHZ);
void radio_init()
{
radio.begin();
radio.setChannel(1);
radio.setPALevel(RF24_PA_MAX);
radio.setDataRate(RF24_1MBPS);
radio.setAutoAck(1);
radio.setRetries(2,15);
radio.setCRCLength(RF24_CRC_8);
radio.printDetails();
}
void condition()
{
if (in==999){
a=999;
radio.stopListening();
radio.write( &a, sizeof(a) );
}
if (in<=temperatura){
a=3;
radio.stopListening();
radio.write( &a, sizeof(a) );
}
if (in>temperatura && in !=999){
a=4;
radio.stopListening();
radio.write( &a, sizeof(a) );
} if (buton == 0){
radio.stopListening();
radio.write( &buton, sizeof(buton));
}
if (buton == 1){
radio.stopListening();
radio.write( &buton, sizeof(buton));
}
}
void receptie()
{
uint8_t pipe = 1;
if ( radio.available(&pipe) )
{
radio.read( &p,sizeof(p));
if (pipe == 1)
{
f = fopen
("/var/www/html/temperatura.txt","w+b");
f2 = fopen
("/var/www/html/umiditate.txt" , "w+b");
fprintf(f,"%.2f", p.temp);
fprintf(f2, "%.2f", p.hum);
printf("Temperatura = %f
umiditatea = %f si pipe -ul =
%i\n\r",p.temp,p.hum,pipe);
fclose(f);
fclose(f2);
delay(5);
}
else
{
f4 = fopen
("/var/www/html/temperatura1.txt" , "w+b");
f5 = fopen
("/var/www/html/umiditate1.txt" , "w+b");
fprintf(f4,"%.2f", p.temp);
fprintf(f5, "%.2f", p.hum);
printf("Temperatura = %f
umiditatea = %f si pipe -ul =
%i\n\r",p.temp,p.hum,pipe);
temperatura=p.temp;
fclose(f4);
fclose(f5);
delay(5);
}
delayMicroseconds(5);
}
}
int main(int argc, char** argv)
{
radio_init();
radio.printDetails();
printf("<<<INCEPE COMUNICAREA>>> \n");
delay(1);
while(1)
{
76
delay (100);
radio.openWritingPipe(pipes[0]);
radio.openRea dingPipe(1,pipes[1]);
radio.openReadingPipe(2,pipes[2]);
radio.openReadingPipe(3,pipes[3]);
radio.openReadingPipe(4,pipes[4]);
radio.openReadingPipe(5,pipes[5]);
radio.stopListening();
f3 = fopen
("/var/www/html/test.tx t","r+b");
fscanf (f3, "%f", &in);
printf (" \n\r in = %f \n" , in); fclose(f3);
f6 = fopen
("/var/www/html/buton1.txt","r+b");
fscanf (f3, "%f", &buton);
printf (" \n\r in = %f \n" , buton);
fclose(f3);
condition();
radio.startListening();
receptie();
}
}
Programul de pe nodul cu senzor DHT11
#include <SPI.h>
#include "RF24.h"
#include <Wire.h>
#include <SimpleDHT.h>
#define pinDHT11 2
const uint64_t pipes[2] = {0xF0F0F0F0D2LL,
0xF0F0F0F0E1LL};
struct pachet {
byte temp;
byte hum;
} p;
SimpleDHT11 dht11;
RF24 radio(7,8);
void setup(void) {
Serial.begin(115200);
radio.begin();
radio.setChannel(1);
radio.setPALevel(RF24_PA_MAX);
radio.setDataRate(RF24_1MBPS);
radio.setAutoAck(1);
radio.setRetries(2,15);
radio.setCRCLength(RF24_CRC_8);
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
radio.startListeni ng();
radio.powerUp();
}
void loop(void){
int err = SimpleDHTErrSuccess;
if ((err = dht11.read(pinDHT11,
&p.temp, &p.hum, NULL)) !=
SimpleDHTErrSuccess)
{
Serial.print("Citirea senzorulul DHT11 a
esuat … ");
Serial.println(err);delay(1000);
return;
}
delay (500);
Serial.print("Se transmite: ");
Serial.print((int)p.temp);
Serial.print(" *C, ");
Serial.print((int)p.hum);
Serial.println(" H");
pp.temp = (float)p.temp;
pp.hum = (float)p.hum;
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1,pipes[0]);
radio.stopListening();
delay (1000);
bool x = radio.write(&pp,sizeof(pp));
if(!x)
{
Serial.println("Comunicare
esuata!!!");
}
else
{
Serial.println("Comunicare cu
Succes!!!");
}
}
Programul de pe nodul cu senzor AM2320
#include <SPI.h>
#include "RF24.h"
#include <Wire.h>
#include <AM2320.h>
AM2320 th;
RF24 radio(7,8);
const uint64_t pipes[2] = {0xF0F0F0F0D2LL,
0xF0F0F0F0E2L L};
77
struct data {
float temp;
float hum;
}d;
void setup(void) {
Serial.begin(115200);
radio.begin();
radio.setChannel(1);
radio.setPALevel(RF24_PA_MAX);
radio.setDataRate(RF24_1MBPS);
radio.setAutoAck(1);
radio.setRetries(2,15);
radio.setCRCLength(RF24_C RC_8);
radio.startListening();
Serial.println(F("*** Transmite….."));
radio.powerUp();
}
void loop(void){
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1,pipes[0]);
radio.stopListening();
th.Read();
delay(1000);
d.temp = th.t;
d.hum = th.h;
if(!radio.write(&d,sizeof(d)))
{Serial.println("Transmitere esuata!!!");
}
else {
Serial.println("Transmis cu scuces!!!");
}
Serial.print("S -a transmis :");
Serial.print(d.temp);
Serial.print("*C ");
Serial.print(d.hum);
Serial.print(" %");
Serial.print(" \n");
}
Programul de pe nodul de control
#include <SPI.h>
#include "RF24.h"
#define PIN1 2
#define PIN2 3
RF24 radio(7,8);
const uint64_t pipe = 0xF0F0F0F0D2LL;
float pachet_receptionat;
void setup(void) {
Serial.begin(115200);
pinMode(PIN1, OUT PUT);
pinMode(PIN2, OUTPUT);
digitalWrite(PIN1, HIGH);
digitalWrite(PIN2, HIGH);
radio.begin();
radio.setChannel(1);
radio.setPALevel(RF24_PA_MAX);
radio.setDataRate(RF24_1MBPS);
radio.setAutoAck(1);
radio.setRetries(2,15);
radio.setCR CLength(RF24_CRC_8);
radio.openReadingPipe(0,pipe);
radio.startListening();
radio.powerUp();
}
void loop(void){
while(radio.available())
{
radio.read(&pachet_receptionat,sizeof(pach
et_receptionat));
Serial.println(pachet_receptionat); delay(100);
if ((int)pachet_receptionat == 999)
{
digitalWrite(PIN1, HIGH);
Serial.println("OFF");
Serial.println(pachet_receptionat);
}
if ((int)pachet_receptionat == 3){
digitalWrite(PIN1, HIGH);
Serial.pr intln("OPRIT");
Serial.println(pachet_receptionat);
}
if((int)pachet_receptionat==4)
{
digitalWrite(PIN1, LOW);
Serial.println("PORNIT");
Serial.println(pachet_receptionat);
}
if((int)pachet_receptionat==0)
{
digitalWrite(PIN2, HIGH);
Serial.println("BUTON PORNIT");
Serial.println(pachet_receptionat);
}
if((int)pachet_receptionat==1)
{
digitalWrite(PIN2, LOW);
Serial.println("BUTON PORNIT");
Serial.println(pache t_receptionat);
}
}
}
78
Programul de scanare al canalelor
#include <cstdlib>
#include <iostream>
#include <RF24/RF24.h>
using namespace std;
RF24 radio(22, 0);
const uint8_t num_canale = 126;
uint8_t val[num_canale];
int i;
const int repetari = 100;
int reset_array=0;
void init(){
radio.begin();
radio.setAutoAck(false);
radio.startListening();
radio.stopListening();
radio.printDetails();
}
void scanare()
{
int repetari_cnt = repetari;
while(repetari_cnt –)
{
int i = n um_canale;
while (i –)
{
radio.setChannel(i);
radio.startListening();
delayMicroseconds(128);
radio.stopListening();
if ( radio.testCarrier() ) ++val[i];
}
}
}
void afisare_nr(){
i = 0;
while ( i < num_canale )
{
printf("%x",min(0xf,(val[i]&0xf)));
++i;
}
printf(" \n");
}
int main(int argc, char** argv)
{
init();
for (;;)
{
memset(val,0,sizeof(val));
scanare();
afisare_nr();
}
}
79
Anexa 2 – Codul interfeței grafice
<!DOCTYPE HTML>
<html lang="en">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font –
awesome/4.7.0/css/font -awesome.min.css">
<head>
<style>
#balon_temp {
position: centre;
border-radius: 100px;
background: #FAAC58;
padding: 40px;
width: 1 20px;
height: 25px;
display: inline -block;
}
#balon_param {
position: centre;
border-radius: 80px;
background: #ff3300;
padding: 30px;
width: 110px;
height: 20px;
display: inline -block;
}
#icon_green1{
font-size: 50px;
color: green;
}
#icon_red1 {
font-size: 50px;
color: red;
}
#icon_green2{
font-size: 50px;
color: green;
}
#icon_red2{
font-size: 50px;
color: red;
}
#submit_text{
margin-top: 10px;
display: inline -block;
}
#submit_button{
margin-top: -19px;
margin-bottom: 20px;
padding:2 0px 25px;
display: inline -block;
}
</style>
<?php
error_reporting(0);
$temp_dorita=$_POST["temp_dorita"];
$power1=0;
80
$power2=0;
?>
<!– Script PhP de controlat pinii GpIO lui Raspberry PI –>
<?php
shell_exec("/usr/local/bin/gpio -g mode 2 out");
shell_ex ec("/usr/local/bin/gpio -g mode 3 out");
if(isset($_GET['buton1_on']))
{
$file=fopen('buton.txt','w');
fwrite($file,'1');
fclose($file);
shell_exec("/usr/local/bin/gpio -g write 3 0");
}
else if(isset($_GET['buton1_off']))
{
$file=fopen('buton.txt',' w');
fwrite($file,'0');
fclose($file);
shell_exec("/usr/local/bin/gpio -g write 3 1");
}
else if(isset($_GET['buton2_on']))
{
$file1=fopen('buton1.txt','w');
fwrite($file1,'1');
fclose($file1);
}
else if(isset($_GET['buton2_off']))
{
$file1=fopen(' buton1.txt','w');
fwrite($file1,'0');
fclose($file1);
}
else if(isset($_GET['buton3_on']))
{
$file1=fopen('buton3.txt','w');
fwrite($file1,'1');
fclose($file1);
shell_exec("/usr/local/bin/gpio -g write 2 0");
}
else if(isset($_GET['buton3_off']))
{
$file1=fopen('buton3.txt','w');
fwrite($file1,'0');
fclose($file1);
shell_exec("/usr/local/bin/gpio -g write 2 1");
}
else if(isset($_GET['centrala_off']))
{
$file2=fopen('test.txt','w');
fwrite($file2,'999');
fclose($file2);
}
?>
81
<!– Scripturi de r efresh pe campuri locale in JavaScript –>
<meta http -equiv="Content -Type" content="text/html; charset=utf8" />
<script type="text/javascript">
function refresh1()
{
var req = new XMLHttpRequest();
console.log("Grabbing Value");
req.onreadystatechange=f unction() {
if (req.readyState==4 && req.status==200) {
document.getElementById('temp').innerText = req.responseText;
}
}
req.open("GET", 'temperatura.txt', true);
req.send(null);
}
function refresh2()
{
var req = new XMLHttpRequest();
console. log("Grabbing Value");
req.onreadystatechange=function() {
if (req.readyState==4 && req.status==200) {
document.getElementById('hum').innerText = req.responseText;
}
}
req.open("GET", 'umiditate.txt', true);
req.send(null);
}
function refresh3()
{
var req = new XMLHttpRequest();
console.log("Grabbing Value");
req.onreadystatechange=function() {
if (req.readyState==4 && req.status==200) {
document.getElementById('temp1').innerText = req.responseText;
}
}
req.open("GET", 'temperatura1.t xt', true);
req.send(null);
}
function refresh4()
{
var req = new XMLHttpRequest();
console.log("Grabbing Value");
req.onreadystatechange=function() {
if (req.readyState==4 && req.status==200) {
document.getElementById('hum1').innerText = req.resp onseText;
}
}
req.open("GET", 'umiditate1.txt', true);
req.send(null);
}
function refresh5()
{
var req = new XMLHttpRequest();
console.log("Grabbing Value");
req.onreadystatechange=function() {
if (req.readyState==4 && req.status==200) {
document.getElementById('param').innerText = req.responseText;
}
}
82
req.open("GET", 'test.txt', true);
req.send(null);
}
function init()
{
refresh1()
var int=self.setInterval(function(){refresh1()},3000);
refresh2()
var int=self.setInterval(function(){r efresh2()},3000);
refresh3()
var int=self.setInterval(function(){refresh3()},3000);
refresh4()
var int=self.setInterval(function(){refresh4()},3000);
refresh5()
var int=self.setInterval(function(){refresh5()},5);
}
</script>
<!– Pagina efectiva GUI –>
<link rel="stylesheet" href="css/style.css">
<title>Casa Inteligenta</title>
</head>
<body onload="init()">
<h1 style="text -align: center;"><span style="black ; font -family: Times New Roman;
font-size: 70px; text -align: justify;">Monitorizare & Contro l</span></h1>
<div id="main">
<div id="updateMe" style="text -align: center;">
<!–<img src="img.jpg" alt="Trulli" width="550" height="250"> –>
<form method="get" action="index.php">
<table
style="width: 75%; text -align: left; margin -left: auto; margin-right: 17%;"
border="0" cellpadding="2" cellspacing="2">
<!– Mai jos se vor afisa in niste containere definite in css cu numele de
balon_temp{} temperaturile si umiditatile citite din fisierele text scrise in condul din
back-end –>
<h1>TEMP ERATURA & UMIDITATEA AFARA</h1>
<h1 id="balon_temp">
<span id= "temp"></span><strong>°c</strong>
</h1>
<h1 id="balon_temp">
<span id= "hum"></span><strong>%</strong>
</h1>
<h1>TEMPERATURA & UMIDITATEA IN CASA </h1>
<h1 id="balon_temp" >
<span id= "temp1"></span><strong>°c</strong>
</h1>
<h1 id="balon_temp" >
<span id= "hum1"></span><strong>%</strong>
</h1>
<h1> Control </h1>
<!– Aici se vor realiza butonele de control care intre ele contin o iconita
care isi va schimba starea in functie de clasa din css apelata –>
<tr>
83
<p style="text -align: center;"><button class="button"
name="buton1_on">Releu1 ON</button>
<?php
$file=fopen('buton.txt','r');
$power1 = fread($file,1);
fclose($file);
if ($power1 == 0)
echo '<i class="fa fa -power-off" id="icon_red1"></i>';
else
echo '<i class="fa fa -power-off" id="icon_green1"></i>';
?>
<button class="button" name="buton1_off" >Releu 1 OFF</button></p>
</tr>
<tr>
<p style="text -align: center;"><button class="button" name="buton2_on">Releu2
ON</button>
<?php
$file1=fopen('buton1.txt','r');
$power2 = fread($file1,1);
fclose($file1);
if ($power2 == 0)
echo '<i cl ass="fa fa -power-off" id="icon_red2"></i>';
else
echo '<i class="fa fa -power-off" id="icon_green2"></i>';
?>
<button class="button" name="buton2_off" >Releu1 OFF</button></p>
</tr>
<tr>
<p style="text -align: center;"><button class="butt on"
name="buton3_on">Releu1 ON</button>
<?php
$file=fopen('buton3.txt','r');
$power1 = fread($file,1);
fclose($file);
if ($power1 == 0)
echo '<i class="fa fa -power-off" id="icon_red1"></i>';
else
echo '<i class="fa fa -power-off" id="icon_green1"></i>';
?>
<button class="button" name="buton3_off" >Releu1 OFF</button></p>
<p style="text -align: center;"><button class="button"
name="centrala_off">CENTRALA_OFF</button>
</tr>
</form>
<form method="post">
<br/>
<!– Aici este formul in care se vor introduce parametrii doriti pentru a -i trimite mai
departe la nodul de control –>
<label> <h2>Temperatura dorita</h2></label>
<input type="text" id="submit_text" name="temp_dorita" value=""
style="font -size: 55pt" size="2"/>
<input type="submit" id="submit_button" value="Submit" class="button"/>
84
<?php
if($temp_dorita!= NULL){
$file=fopen('test.txt','w');
fwrite($file,$temp_dorita);
fclose($fil e);}
$file3=fopen('test.txt','r');
$stare = fread($file3,3);
if ($stare == 999)
echo '<h1 id="balon_param"><span id= ""></span><strong>OFF</strong></h1>';
else
echo '<h1 id="balon_param"><span id= "param"></span><strong>°c </strong></h1>';
fclose($file3);
?>
</form>
</table>
</div>
</div>
</body>
</html>
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: Realizarea unui sistem de achiziție de date și de [618076] (ID: 618076)
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.
