MIMO Virtual în rețele de senzori wireless [617196]

1
Universitatea “Politehnica” din București
Facultatea de Electronică, Telecomunicații și Tehnologia Informației

MIMO Virtual în rețele de senzori wireless
Proiect de diplomă
prezentat ca cerință parțială pentru obținerea titlului de
Inginer în domeniul Calculatoare și Tehnologia I nformației
programul de studii de licență Ingineria I nformației

Conducător științific Absolvent
Ș.l. Dr. Ing. Dragoș Ioan Săcăleanu Marian Petre

2016

2

3

4

5

6

7
Cuprins

Introducere ………………………….. ………………………….. ………………………….. ………………………… 13
1. Rețele de senzori wireless ………………………….. ………………………….. ………………………….. .. 15
1.1 Noțiuni introductive ………………………….. ………………………….. ………………………….. ….. 15
1.2 Caracteristici și constrângeri ………………………….. ………………………….. ……………………. 16
1.3 Arhitectura unui nod ………………………….. ………………………….. ………………………….. ….. 18
1.4 Nivelul Fizic ………………………….. ………………………….. ………………………….. ……………… 21
1.5 Sincronizarea în timp ………………………….. ………………………….. ………………………….. …. 26
2. MIMO în rețele de senzori wireless ………………………….. ………………………….. ………………. 31
2.1 Caracteristici MIMO ………………………….. ………………………….. ………………………….. ….. 31
2.2 MIMO Virtual ………………………….. ………………………….. ………………………….. …………… 35
3. Realizarea practică ………………………….. ………………………….. ………………………….. …………. 37
3.1 Descriere Componente ………………………….. ………………………….. ………………………….. .. 37
3.2 Implementare ………………………….. ………………………….. ………………………….. ……………. 38
3.3 Rezultate măsurători ………………………….. ………………………….. ………………………….. ….. 42
3.4 Proiectarea interfeței de interconectare hardware ………………………….. ……………………. 46
Concluzii ………………………….. ………………………….. ………………………….. ………………………….. 51
Bibliografie ………………………….. ………………………….. ………………………….. ……………………….. 53
Anexe ………………………….. ………………………….. ………………………….. ………………………….. …… 55
Anexa 1. Montajul realizat ………………………….. ………………………….. ………………………….. .. 55
Anexa 2. Codul sursă ………………………….. ………………………….. ………………………….. ………. 56

8

9
Lista figurilor

Figura 1.1 – Transmi sie single -hop versus multi -hop ………………………………………………….. ……….. . 17
Figura 1.2 – Componentele unui nod …………………………… …………………………. …………………………. . 19
Figura 1.3 – Componentele modulului de transmisie …………………………… ……………………………….. 21
Figura 1.4 – Ilustrarea fenomenului de propagare a undelor …………………. ………………………. ………. 23
Figura 1.5 – Propagare multicale ……………………………………………………. ………………………………….. 23
Figura 1.6 – Ilustrarea tipurilor de modula ție ……………………………………………. ……………. …………… 25
Figura 1.7 – Protocolul LTS centralizat …………………………………………………….. ………. ……………….. 28
Figura 1.8 – Protocolul ACS ……………………………………………………. ………………………. ………………. 29
Figura 2.1 – Ilustrarea sistemelor de transmisiune ……………… …………………. …………… ………………… 32
Figura 2.2 – Sistem MIMO 𝑁𝑡 𝑥 𝑁𝑡 ………………………………………………….. ………………………. ………. 33
Figura 2.3 – a) Diversitate b) Multiplexare spa țială …………………. ………………………. ………………….. 34
Figura 3.1 – Schemă conectare componente la un nod cu senzor ………………………. ……………………. 37
Figura 3.2 – Transmisie MIMO cooperativ ă …………………………… ……………………… ……………………. 38
Figura 3.3 – Nod S Activ ………………………………………………………………….. ……………………… ………. 42
Figura 3.4 – Nod S – Power down ……………………………. ……………………… …………………………………. 42
Figura 3.5 – Nod S – Puls transmisie ………………………………………………. …………. ………….. …………… 43
Figura 3.6 – Nod 𝑇1 – Activ ……………………………………………………… ……………………… ………………… 43
Figura 3.7 – Nod 𝑇1 – Power -down ………………………………………………….. ………………………. ………… 44
Figura 3.8 – Nod 𝑅1 – Activ …………………………………………………………… …………………. ………………. 44
Figura 3. 9 – Nod 𝑅2 – Power -down ………………………………………………………. ……………………… ……. 45
Figura 3.10 – Schem ă electric ă interfa ță hardware …………… …………………………………………. ……….. 46
Figura 3.11 – Cablaj imprimat interfa ță hardware a) strat bottom b) strat top c) ambele straturi …. 46
Figura 3.12 – Cablaj textolit ………………………………………………………………………. ………………………. 47
Figura 3.13 – Placa textolit dupa a șezarea foii cu cablaj ………………………………… ………… …………… 47
Figura 3.14 – Folosirea fierului de c ălcat pentru transpunerea tonerului ……………………… …………… 48
Figura 3.15 – Cablajul cu traseele imprimate ……………………………………………………… ……………….. 48
Figura 3.16 – Cablajul imprimat în solu ția de clorur ă ferică ………………….. ………………………. ……… 49

10

11
Lista acronimelor

WSN – Wireless Sensor Network
MIMO – Multiple Input Multiple Output
SISO – Singlue Input Single Output
RF – Radio Frequency
MAC – Medium Access Control
FPGA – Field Programmable Gate Array
ASIC – Application Specific Integrated Circuit
RAM – Random Access Memory
ROM – Read Only Memory
EEPROM – Electrically Erasable Programmable Read -Only Memory
OSI – Open Systems Interconnection
ADC – Analog to digital converter
AM – Amplitude Modulation
FM – Frequency Modulat ion
PM – Phase Modulation
SNR – Signal to Noise Ratio
UTC – Coordinated Universal Time
Tx – Transmit
Rx – Receive
Hz – Hertz
A – Amper
μ – Micro
s – Secundă
° C – Grad Celsius

12

13
Introducere

Tehnologiile MIMO (Multiple Input Multiple Output) au început să fie folosite din ce în ce
mai des în ultimii ani în sisteme radio, fiind găsite în standarde ca 3GPP LTE, LTE -A și IEEE
802.11ac (WIFI), pentru că oferă o eficientă spectrală ridicată și o r ată de eroare per bit mică, ducând
la un consum redus de energie față de tehnologiile de tip SISO (Single Input Single Output). Luând
în considerare că dispozitivele utilizate în comunicații mobile au dimensiuni mici, este dificilă
integrarea mai multor an tene într -un singur dispozitiv. Din acest motiv s -a trecut la utilizarea unor
tehnici de cooperare, formându -se sisteme de tip MIMO virtual (sau cooperativ), la care terminalele
mobile sunt grupate fizic pentru a se realiza transmisia și recepția datelor.
Luând în considerare avantajele acestor tehnologii și constrângerile energetice și de spațiu
ale rețelelor de senzori wireless, au început să fie cercetate modalități prin care pot fi adaptat e
tehnologiile MIMO cooperative la acestea.
Proiectul d e față are ca scop realizarea unei transmisiuni multi -hop de tip MIMO virtual, care
va transmite datele la un nod coordonator, folosind componente create pentru aplicații cu un consum
redus de energie. Transmisia și recepția datelor necesită, în general, c ea mai mare cantitate de energie
în rețele le de senzori wireless, din acest motiv fiind necesară o cooperare eficientă a nodurilor din
rețea. În plus, va fi dezvoltată o interfață de interconectare hardware între platform a de dezvoltare și
transceiver.

14

15
1. Rețele de senzori wireless

1.1 Noțiuni introductive

Senzorii sunt folosiți pentru a detecta și monitoriza fenomene fizice și a le transforma într -o
formă ce permite să fie prelucrate și stocate. În general, aceștia convertesc fenomenul studiat într -un
semnal electric, care este afișat de un dispozitiv la locația la care se află senzorul sau este transmis
prin intermediul unei rețele pentru a fi prelucrat sau stocat în altă locație. Senzorii care au c a ieșire
un semnal electric sunt denumiți traductori. Aceștia sunt integrați într -o multitudine de dispozit ive și
au numeroase aplicații, cum ar fi creșterea productivității și a securității, detectarea catastrofelor
naturale, măsurarea distanței, temperat urii și a presiunii . [1] [2]
Fenomenele observate de către senzori și transformate în semnal electric nu sunt în starea
necesară pentru a fi stocate și trebuie să treacă printr -un proces de condiționare. De exemplu, poate
fi necesară amplificarea sau atenuarea semnalului pentru a fi posibilă conversia semnalului analogic
într-un semnal digital sau aplicarea unui filtru pentru a elimina zgomotul. În continuare, semnalul
poate fi convertit folosind un convertor analog -digital și vizualizat sau stocat. Di spozitivele ce au în
componența senzori pot avea și actuatori ce le oferă posibilitatea să controleze mediul .[1] [2]
O rețea de senzori wireless este formată din noduri ce au în componență senzori autonomi,
care monitorizează fenomene fizice și transmit in formațiile preluate, printr -o rețea wireless, la un nod
principal, unde pot fi analizate și stocate. Pot fi realizate rețele de mii de noduri în funcție de aria
geografică pe care dorim să o monitorizăm, fiecare nod realizând operațiile de colectare, proce sare și
transmitere a informației. Din acest motiv, este necesar ca un nod să aibă integrate componente ce
realizează procesarea și transmiterea informației. [3]
În funcție de structura fizică a unui nod, putem clasifica rețele de senzori wireless în două
categorii: rețele omogene, la care toate nodurile sunt la fel și rețele eterogene, la care nodurile sunt
diferite. Luând în considerare că în ambele cazuri nodurile vor fi, în general, alimentate cu baterii
care nu pot fi schimbate sau reîncărcate, consum ul de energie reprezita factorul cel mai important în
proiectarea unei rețele de senori wireless. [1] [2]
Complexitatea unei rețele de senzori wireless variază de la caz la caz. În anumite situații pot
detecta un singur fenomen fizic, în timp ce în alte c azuri putem avea dispozitive mai complexe ce
monitorieaza mai multe fenomene. Acestea mai pot varia și prin modul în care transmit datele, de
exemplu, prin intermediul undelor radio, radiației infraroșii sau microundelor. În plus, se pot adăuga
o mare vari etate de componente, cum ar fi un receptor GPS pentru a -și putea determina locația, dar
aceste sisteme nu sunt fezabile în cazul în care dorim crearea unei rețele de senzori cu un consum
redus de energie. Cel mai cunoscut standard pentru comunicații wirele ss este IEEE 802.11 și este
folosit în anumite rețele de senzori, dar consumul de energie crescut nu permite folosirea acestuia în
majoritatea aplicațiilor. Acest lucru a dus la crearea mai multor protocoale, cum ar fi standardul IEEE
802.15.4, folosit în cazul în care este necesară comunicarea pe distanțe scurte (10 -30 m), la un cost
scăzut și cu viteze de transfer reduse. [1] [4]

16
Rețele tradiționale Rețele de senzori wireless
Vitezele de transfer și latențele reprezintă
principalele preocupări, nu consumul de energie Consumul de energie reprezint ă principala
constrângere în proiectarea nodurilor
Sunt proiectate conform unui plan bine stabilit Amplasarea, structura rețelei și resursele
utilizate sunt ad hoc
Mentenanța și reparația poți fi realizate cu
ușurință, fiind facil accesul la rețea Accesul fizic la noduri este în multe cazuri
dificil
Defectarea unei componente necesită reparație Defectarea unei componente este un fe nomen
obișnuit și se ține cont de asta în proiectarea
rețelei
Administrarea centralizată este fezabilă Majoritatea deciziilor sunt luate fără un
coordonator central

Tabel 1.1 Comparație între rețele tradiționa le și cele de senzori wireless [1]

1.2 Caracteristici și constrângeri

Deși au multe similarități cu alte sisteme distribuite, rețelele de senzori au constrângeri și
provocări specifice. Următoarele caracteristici sunt comune la majoritatea rețelelor de acest tip.
– Consumul de energie
Noduri le dintr -o rețea trebuie, în general, să aibă un consum redus de energie. În mod uzual,
acest ea sunt alimentate cu baterii care trebuie înlocuite sau reîncărcate când s -au descărcat, dar în
anumite cazuri nu este posibil. În funcție de posibilitatea de a reîncărca sau schimba o baterie, trebuie
alese strategii diferite pentru a limita consumul. Trebuie ținut cont că în foarte mult e cazuri nu pot fi
schimbate sursele de energie, ceea ce înseamnă că acest factor este unul dintre cei mai importanți de
ținut cont atunci când proiectăm o rețea de senzori. Nefuncționarea unor noduri poate duce la
schimbări semnificative în topologia unei rețele, ceea ce poate afecta semnificativ consumul. [1] [2]
[4]
– Autoorganizarea rețelei
Anumite aplicații necesită ca o rețea să funcționeze în locații greu accesibile unde nu există
infrastructura necesară pentru a se realiza mentenanța sau reparare a nodurilor, așa că este necesar ca
rețeaua să aibă capacitatea de a se auto -organiza, adică trebuie să existe mecanisme automate pentru
cazurile în care anumite noduri se strică sau au loc sch imbări în mediul înconjurător. [1] [4]
– Administrarea
Din c auza dimensiunii mari a rețelei și a necesității de a avea un consum cât mai mic de
energie, nu se apelează în general la algoritmi de administrare a rețelei controlați de un nod central.
Putem considera cazul în care avem un nod de bază care centralizează datele de la restul nodurilor,
alege rutele în funcție de costul energetic și informează fiecare nod de rută ce trebuie să o urmeze,
dar acesta poate crește mult consumul, în special dacă se schimbă des topologia. În cazul în care nu

17
avem un nod coordonat or, nodurile trebuie să colaboreze cu vecinii din jur pentru a face decizii. În
acest mod, este posibilă cr eșterea eficienței energetice. [1]
– Transmisie multi -hop
Transmisia pe distante lungi necesită o putere prea mare pentru a avea un consum redus de
energie. Relația între puterea la recepție și cea de la transmi sie a unui semnal RF poate fi exprimată
folosind formula:
𝑃𝑟∝𝑃𝑡
𝑑2
așadar creșterea distanței necesită o putere mult mai mare la transmisie, deci este mai eficient să
folosim noduri intermediare, care vor funcționa ca relee. Această transmisie crește complexitatea
rețelei, pentru că este preferabil ca un nod să închidă aparatul de emisie -recepție când nu este folosit
pentru a conserva energie. [1] [2] [9]

Figura 1.1 Transmisie single -hop versus multi -hop [1]
– Securitate a
Anumite rețele de senzori colectează date ce trebuie ținute secret, dar acest lucru este dificil
pentru că transmisia wireless ușurează supravegherea comunicațiilor. Unul dintre cele mai mari
probleme îl reprezintă atacul de tip denial -of-service, care îngreunează comunicația în rețea. În cazul
altor tipuri de rețele, riscul este mai mic pentru ca acestea au o sursă constantă de energie, dar în cazul
curent trebuie create și folosite soluții diferi te pentru a spori securitatea. [1]
– Dimensiunea unui nod
Este esențial ca în proiectarea unei rețele de senzori să fie folosite noduri cu dimensiuni mici.
Acest lucru nu permite utilizarea multor componente, dar implică și constrângeri legate de
performanțele unității de procesare folosită sau de capacitatea memoriei utilizate. Aceste limitări
afectează și software -ul, care trebuie să utilizeze mai puține resurse. De exemplu, dacă dorim să
realizăm o rețea în care un nod are în tabelul de rutarte toate destinațiile posibile, s -ar putea să nu
avem memoria necesară și singură soluție să fie doar cunoașterea nodurilor vecine. [1]
– Colaborare între noduri
În multe situații, un senzor nu poate decide dacă un eveniment a avut loc și este necesar ca
mai mulți senzori să colaboreze și să realizeze o agregare a datelor, realizându -se procesarea necesară
local. [2]

18
– Scalabilitate a
Numărul de senzori utilizați pentru a studia un fenomen poate să ajungă la valori foarte mari
(de ordinul milioanelor în situații extreme), așadar trebuie folosiți algortimi și protocoale ce permit
astfel de configurații . [3]
– Fiabilitatea
O parte din s enzori se pot strica sau nu pot funcționa datorită puterii de transmisie redusă.
Aceste defecte nu ar trebui să afecteze misiunea rețelei de senzori, adică este necesară o fiablitate
crescută. În [5] fiabilitatea unui sensor indivdual a fost modelată cu o distribuție Poisson care arată
probabilitatea de a nu a avea un defect în intervalul (0, t):
𝑅𝑘(𝑡)=exp (−λ𝑘𝑡)
unde λ𝑘 este rata de defectare a nodului 𝑘 (presupusă a fi constantă) și t perioada de timp.
– Densitatea
Numărul de noduri pe o unitate de suprafața, denumită densitatea rețelei, poate varia destul
de mult în funcție de scopul rețelei. Aceasta poate varia connsiderabil în timp și spațiu chiar și într -o
rețea, deci este necesar ca aceaasta să se poată adapta. În lucrarea [6] densitatea este exprimată prin:
𝜇(𝑅)= 𝑁∙ 𝜋 ∙𝑅2
𝐴
unde N reprezintă numărul de noduri, A este aria regiunii și R distanța transmisiunii radio. Pentru
anumite fenomene, dacă depășim un prag al densității, nu vom avea imbunatari ale preci ziei
măsurătorilor. Putem modifica densitatea în cazul în care schimbăm puterea transmisiunii. În [7] s -a
arătat că utlizarea unui număr foarte mic sau foarte mare de noduri este ineficient și că numărul optim
descrește odată cu puterea consumată pentru de tecție.

1.3 Arhitectura unui nod

Elementul central în proiectarea unei rețele de senzori wireless îl reprezintă arhitectura unui
nod, deoarece acesta realizează funcțiile de detectare, procesare și comunicare. Acesta are stocat în
memorie protocoalele de comunicație și de procesare a datelor folosite . În plus față de cerințele
hardware menționate anterior, trebuie ținut cont și de software -ul utilizat. [1] [2]
În alegerea componentelor hardware este esențial să ținem cont de aplicația în care va fi
folosită rețeaua de senzori. Există cazuri în care nodul trebuie să aibă greutatea mai mică decât 100g,
să disipe mai puțină putere decât 100 μW sau chiar să aibă dim ensiunea unui grăunte de praf dacă
este folosit în domeniul militar. Totuși există posibilitatea ca un nod să fie folosit ca o stație
meteorologică, ceea ce implică dimensiuni mult mai mari, dar tendința generală este de a minaturiza
componetele utilizate. [2] [8]
Un senzor este alcătuit din 6 componente principale:
– Procesor : folosit pentru a procesa datele și a executa codul necesar
– Memorie: necesară pentru a stoca programele utilizate și datele intermediare
– Senzor și actuator: pentru interfaț area între hardware și fenomenele fizice

19
– Dispozitiv pentru comunicație: pentru a putea crea o rețeaua între noduri
– Sursă de alimentare: pentru a alimenta sistemul, în multe cazuri fiind posibilă utilizarea doar
unei baterii.

Figura 1.2 Componentele unui nod [2]

Toate aceste componente trebuie să funcționeze a stfel încât să consume cât mai puțină
energie, ceea ce implică închiderea controllerului și a dispozitivului de comunicație în marea
majoritate a timpului. Dacă este necesar, senz orul poate trimite un semnal de întrerupere către
controller în momentul în care detectează depășirea unui prag. Utilizarea unor operații de întrerupere
duce la posibilitatea ca controllerul să fie pornit numai dacă senzorul a detectat un eveniment, de
exemplu în cazul în care monitorizează mișcarea unui obiect. [2]
Procesorul este unitatea care procesează toate informațiile necesare și decide modul în care
un nod își îndeplinește sarcinile. Poate fi ales un procesor de uz general, dar acestea au în general
prea multă putere de procesare pentru aplicațiile folosite și un consum de energie excesiv. Din aceste
motive sunt mai convenabile microcontrollere. Acestea au în general și memorie integrată, dar și
posibilitatea de a intra în moduri de operare în care consumul de energie scade semnificativ pentru ca
anumite părți sunt inact ive. Există și posibilitatea folosirii procesoarelor de semnal digital, dar
operațiile de procesoare a semnalului în rețele de senzori nu implică, în general, necesitatea unor
astfel de dispozitive. În cazul în care rețeaua va fi folosită pentru anumite ap licații ce nu implică multă
flexibilitate, pot fi folosite procesoare specializate ca ASIC -uri, dar ușurința folosirii
microcontrollerelor a dus la utilizarea lor în majoritatea rețelelor de senzori wireless. [2]
Pentru a putea realiza operațiile necesar e este nevoie ca un nod să aibă memorie de tip Random
Access Memory (RAM), utilizată datorită vitezelor de transfer foarte mari. Dezavantajul este că
datele sunt pierdute dacă nu mai este alimentată. În general, codul programului este stocat în memoria
EEPROM (Electrically Erasable Programmable Read -Only Memory ), dar este posibilă stocarea și în
memoria flash sau ROM (Read Only Memory). Memoria flash poate fi folosită și în cazul în care nu
avem destul RAM, dar trebuie să ținem cont d e consumul de energie c rescut. [2]
În unele cazuri cea mai bună alegere pentru conectarea nodurilor este cu fire, dar, în foarte
multe aplicații, nu este o opțiune viabilă, deoarece componentele se află la mare distanță unele față
de altele, dar și pentru ca acestea pot fi mobile, de aceea se utilizează comunicația fără fire. În acest
caz, trebuie să începem prin a alege mediul de transmisie, cele mai des utilizate fiind: undele radio,

20
undele infraroșii sau microundele. Dintre acestea cea mai convenabilă pentru rețele de senzori
wireless est e transmisia prin unde radio pentru că permite transmiterea la distante relativ mari, cu rațe
de transfer mari, la un cost energetic redus și nu necesită ca transmițătorul și receptorul să fie în
același câmp vizual. [2]
Nodurile trebuie să poată realiza comunicații bi -direcționale, din acest motiv este nevoie să
aibă un dispozitiv de transmisie, dar și unul de recepție, acestea realizând conversia dintr -un șir de
biți în unde radio și invers. În general, acestea sunt integrate într -un singur dispozitiv, n umit
transceiver. [2]
În alegerea unui transceiver ar trebui să ținem cont de următoarele caracteristici principale:
– Consumul de energie, fiind necesară reducerea cât mai multă este esențială comutarea,
preferabil rapidă, între starea activă de funcțio nare și cea inactiva, dar trebuie ținut cont și de faptul
că în multe cazuri această comutare necesită multă energie . În cazul rețelelor de senzori wireless,
unde avem o putere mică la transmisie (în mod uzual 0 dBm, adică 1mW), se observă că transmisia
și recepția consumă aproximativ aceeași putere și că în anumite arhitecturi starea de așteptare
consumă la fel de mult , așa că este necesar ca transceiver -ul să fie inactiv în cea mai mare perioadă
de timp. [2] [15]
– Freceven ța purtătoarei: pentru evitarea congestiei este necesar ca un transceiver să -și poată
schimbă frecvență purtătoarei.
– Rată de transfe r: determina tă în principal de lățimea de bandă, tipul de modulație folosită și
de frecvența purtătoarei. Valorile tipice sunt de câteva sute de kb/s, considerabil mai puțin față de
sistemele de comunicații mobile, dar suficient pentru majoritatea aplicațiilor. Se poa te modifica
schimbând rata de simboluri sau prin schimbarea tipului de modulație. [1]
– Câștigul: reprezintă raportul dintre puterea semnalului la ieșire și puterea semnalului la
intrare, fiind uzual exprimat în decibeli (db). Este preferabil un câștig mare la amplificare pentru a
avea o eficientă energetică ridicată. [2]
-Sensibilitatea rec eptorului: reprezintă puterea minimă de intrare a unui semnal pentru care
obținem la ieșire un coeficient de distingere a semnalului util față de zgomot, fiind exprimat în dBm
sau în frecvența biților eronați la receptoarele digitale. Acesta trebuie stabil it în funcție de cerințele
aplicației, dar este utilă o sensibilitat e cât mai mare. [1]
– Selectivitatea: abilitatea de a respinge semnalele nedorite din canalele adiacente [1]
– Stabilitatea frecvenței: este reprezentată ca raportul dintre variația rela tivă a frecvenței și
variația relativă a fenomenului care cauzează această variație la un oscilator. Variația următorilor
factori determină instabilități: temperatura, presiunea, umiditatea, tensiunea de alimentare, impedanța
de sarcină sau deformațiile me canice .[1] [2]
– Tensiunea de alimentare: pentru a nu fi necesare stabilizatoare de tensiune, este de dorit ca
transceiverul să funcționeze la diferite valori de alimentare. [1] [9]
Ca sursă de alimentare se folosesc baterii, care pot fi de două tipuri: primare (de unică
folosință) sau secundare (reîncărcabile). La descărcarea acesteia, energia chimică se transformă în
energie electrică prin intermediul unei reacții electrochimice. Acestea ar trebui să aibă o capacitate
mare la un preț redus și un volum mic.

21

1.4 Nivelul F izic

Rețelele de senzori wireless folosesc o arhitectură stratificată bazată pe modelul OSI (Open
Systems Interconnection ) în care avem următoarele niveluri:
1. Nivelul Fizic – responsabil de codarea sursei și a canalului, detectarea semnalelor și
modulația semnalului transmis . [11]
2. Nivelul Legătură de Date – se ocupă cu cooperarea între nodurile rețelei, fiind responsabil
de de tectarea erorilor, multiplexare și prevenirea coliziunilor pachetelor. [11]
3. Nivelul Rețea – răspunzător pentru găsirea celei mai eficiente rute astfel încât să fie utilizate
cât mai puține resurse. Rutarea reprezintă una dintre cele mai mari probleme la WSN. Este esențial
ca toate nodurile să poată funcționa ca un router pentru cazuril e în care unele se defectează. [9]
4. Nivelul Transport – folosit în momentul în care este necesară stabilirea unei conexiuni cu o
altă rețea. [11]
5. Nivelul Aplicație -care realizează o interfață între utilizator și aplicațiile folosite și
coordonează comunicați a între aplicații. În lucrarea [12] sunt descrise protocoale folosite pentru a
asigura confidențialitatea datelor și autentificare, care pot fi implementate folosind componente cu o
complexitate redusă și folosite pentru a crea protocoale de nivel superior . [11]
Nivelul fizic realizează conversia șirului de biți în semnale pentru a fi realizată comunicația
între noduri. O mare parte din avantajele folosirii WSN se datorează comunicației wireless, dar
introduce și o multitudine de provocări. Transmisia pe distante mari implică costuri ridicate și o
creștere a complexității circuitelor necesare. În figură 1.3 sunt ilustrate componentele și modul de
transmisie într -o comunicație wireless. [9]

Figura 1.3 Componentele modulului de transmisie [1]

Inițial, senzorul produce un semnal analogic care trebuie convertit într -un semnal digital în
timp și amplitudine. Rata de eșantionare trebuie să fie cel puțin cât rată Nyquist pentru a nu se pierde

22
informații. Semnalul este convertit într -un flux binar, adică este realizată codarea sursei. Următorul
pas este codarea canalului pentru a rezolva problemele apărute din cauza zgomotului și interferenței
prezente în canalul de comunicație, fiind posibilă utilizarea a două metode: folosirea simbolulilor
redundante sau prin transmiterea de cuvinte de cod. În continuare, este realizată modulația, necesară
pentru că sunt folosite antene mici. În final, semnalul trebuie amplificat ș i convertit din energie
electrică în energie electromagnetică de către antenă și trimis către destinație. Receptorul realizează
aceleași operații în sens in vers și sunt stocate în memorie. [1] [9]
Codarea sursei implică eșantionarea, cuantizare și, final, codarea. Senzorul produce un semnal
analogic 𝑠(𝑡), care va fi eșantionat și cuantizat de către ADC, din care va rezulta o secvență de
eșantioane 𝑆=(𝑠[1],𝑠[2],…,𝑠[𝑛]). Vom avea o eroare de cuantizare care va fi modelat ă ca o
variabil ă aleatore. Folosin d simbolurile rezultate vom forma cuvinte de cod. Totalitatea cuvintelor de
cod pot fi decodate în mod unic dacă este respectată relația:
∑1
𝑟𝑙𝑖𝑛
𝑖=1≤1
unde 𝑙𝑖 reprezintă lungimea cuvântului de cod i. Cele mai folosite metode pentru codarea sursei sunt
Pulse code modulation ( PCM) și delta modulation (DM). Pentru a putea transmite date prin canal cu
o probabilitate de eroare mică este necesar să fie respectată teorema lui Shannon:
𝐶=𝐵 log 2(1+𝑆𝑁𝑅 ) [b/s]
u nde C este capacitatea canalului, B este lățimea de bandă a canalului (măsurată în hertz) și SNR
reprezintă raportul semnal -zgomot.
𝑆𝑁𝑅 =10 log 10𝑃𝑆
𝑃𝑧𝑔=20log 10𝑈𝑒𝑓𝑒𝑐𝑡𝑖𝑣 _𝑠
𝑈𝑒𝑓𝑒𝑐𝑡𝑖𝑣 _𝑧𝑔
Din teorema lui Shannon se poate deduce că pute m avea erori dacă transmisia are loc la o rată
mai mare decât capacitatea canalului sau dacă zgomotul este pr ea mare față de semnalul util.
În timpul parcurgerii canalului de comunicație, undele sunt distorsionate, sursele acestor
deformări putând fi cla sificate în următoarele categorii:
1. Atenuare – puterea semnalului fiind atenuată proporțional cu distanță parcursă în timpul
propagării prin aer. [1]
2. Reflexie și refracție – prima constă în schimbarea direcției de propagare a unei părți a unei
unde la întâlnirea unui obiect cu o dimensiune mai mare ca lungimea de undă (clădiri, suprafața
pământului, pereți), astfel încât undă să se întoarcă în mediul din care a provenit. În f uncție de
caracteristicile celor două obiecte o parte din undă se propagă prin mediul înt âlnit, fenomen numit
refracție. [1]
3. Difracție – fenomen prin care unda electromagnetică își schimbă direcția de propagare la
întâlnirea uno r vârfuri ascuțite sau m uchii. [1]
4. Scattering – fenomen care presupune schimbarea direcției undei de propagare la întâlnirea
mai multor obiecte care sunt mici co mparabile cu lungimea de undă. [9]
În figura 1.4 sunt ilustratele fenomenele descrise mai sus.

23

Figura 1.4 Ilustrarea fenomenului de propagare a undelor [2]
Undele electromagnetice emise de o antenă se pot propaga uniform în toate direcțiile, în acest
caz fiind o antenă omnidirectioanala, sau poți fi direcționate spre o anumită direcție. În ambele cazuri
este de așteptat ca mai multe copii ale aceluiași semnal să ajungă la recepție prin difierite căi și cu
diferite atenuări, fenomen numit propagare multicale. În momentul în care două unde ajung la
receptor pe diferite căi, vom avea un defajaz între ele, care depi nde de diferența dintre drumurile
parcurs e, iar amplitudinea semnalului la recepție va depinde de acest defazaj. În acest caz putem avea
o interferenț ă constructivă sau destructivă. [9]

Figura 1.5 Propagare multicale [33]
Pentru a combate efectele propagării multicale se utilizează tehnici de corecție a erorilor.
În rețele de senzori wireless sunt preferate codurile bloc pentru a realiza codarea canalului
pentru că sunt ușor de implementat și necesită puțină memorie. Un cod bloc transformă un mesaj de
intrare de k biți într -un mesaj de n biți, unde n > k și la care putem corectă până la t biți la care avem
erori. Cele mai folosite metode sunt:
1. Coduri BCH -coduri ciclice binare corectoare de erori multiple la care cuvintele de cod se
exprimă poli nomial.
2. Coduri Reed -Solomon -care a daugă biți redundanți la mesaj. Pentru a face un cuvânt de cod
de n simboluri, se iau k simboluri de date și m biți, la care adăugăm r simboluri de paritate redun danți.
Poate realiza corecția a 𝑡=𝑟
2 erori.
3. Coduri Cyclic Redundancy Check (CRC) -folosite în aproape toate sistemele de
comuncatie. Acestea realizează doar detecția erorilor, dar nu le pot corecta. [9]
Modulația este procesul prin care se modifică parametrii unui semnal numit semnal purtător
de către semnalul de bază, numit semnal modulator, din care rezultă semnalul modulat. Semnalul
purtător este un semnal cosinusoidal în cazul modulației analogice și e ste de forma :
𝑠𝑐(𝑡)=𝑆𝑐 cos (𝜔𝑡+ 𝜑(𝑡))

24
unde 𝑆𝑐 reprezintă amplitudinea , 𝑓𝑐=𝜔
2𝜋 frecvența și 𝜑(𝑡) faza semnalului. Informația este transmisă
prin modificarea unuia dintre acești parametrii. De aici rezultă 3 tipuri de modulație:
– Modulație în amplitudine , la care avem semnalul modulat descris de relația:
𝑠𝑀𝐴(𝑡)= 𝑆𝑐 𝑆𝑚cos(2𝜋𝑓𝑚𝑡+𝜑𝑚(𝑡))cos (2𝜋𝑓𝑐𝑡 + 𝜑𝑐(𝑡))
Dacă considerăm ce le două semnale în fază, adică 𝜑𝑚= 𝜑𝑐=0, vom avea:
𝑥𝑀𝐴(𝑡)= 𝑆𝑐 𝑆𝑚cos(2𝜋𝑓𝑚𝑡)cos (2𝜋𝑓𝑐𝑡)
unde putem aplica formula lui Euler 𝑒𝑗𝜔𝑡=cos(𝜔𝑡)+𝑗 sin (𝜔𝑡) și va rezulta:
𝑠𝑀𝐴(𝑡)= 𝑆𝑐 𝑆𝑚
2[cos(2𝜋(𝑓𝑚+𝑓𝑐 )𝑡)cos(2𝜋(𝑓𝑐−𝑓𝑚 )𝑡)]
– Modulație în fază, la care avem semnalul purtător:
𝑠𝑐(𝑡)= 𝑆𝑐cos(𝜑(𝑡))
în care relația dintre 𝜑(𝑡) și pulsația 𝜔(𝑡) este:
𝜑(𝑡)= ∫ 𝜔(𝜏)𝑑𝜏+𝜑0𝑡
0
În continuare, modulația de fază este:
𝜑(𝑡)= 𝜑𝑐(𝑡)+ ∆𝜑(𝑡)
în care 𝜑𝑐(𝑡)= 𝜔𝑐𝑡, iar deviația ∆𝜑(𝑡) este proporțională cu semnalul modulator:
∆𝜑(𝑡)= 𝐾𝑝 𝑠(𝑡)
din care rezultă:
𝜑(𝑡)=𝜔𝑐𝑡+ 𝐾𝑝 𝑠(𝑡)
unde vom avea semnalul modulat în fază:
𝑠𝑀𝑃(𝑡)=𝑆𝑐cos[𝜔𝑐𝑡 + 𝐾𝑝 𝑠(𝑡)]
– Modulație în frecvență, caracterizată de expresia:
𝜔(𝑡)= 𝜔𝑐+ ∆𝜔(𝑡)
în care deviația ∆𝜔(𝑡) este proporțională cu semnalul modulator:
𝜔(𝑡)= 𝜔𝑐+ 𝐾𝜔 𝑠(𝑡)
unde vom folosi relația:
𝜑(𝑡)= ∫ 𝜔(𝜏)𝑑𝜏+𝜑0𝑡
0
si 𝜑0=0, din care vom avea :
𝜑(𝑡)=𝜔𝑐𝑡+ 𝐾𝜔∫ 𝑠(𝜏)𝑑𝜏𝑡
0
iar semnalul modulat în frecvență va fi:

25
𝑠𝑀𝐹(𝑡)=𝑆𝑐cos[𝜔𝑐𝑡 + 𝐾𝜔 ∫𝑠(𝜏)𝑑𝜏𝑡
0]
Până acum s -a considerat cazul în care semnalul modulator este analogic, dar în cazul nostru
semnalul transmis este digital, la care parametr ii sunt amplitudinea, perioada 𝑇= 1
𝑓 , faza inițială
(dată de 𝑡0) și durata 𝜏 . În cazul acesta vom avea:
– Amplitude shift keying (ASK) , cea mai simplă formă a acesteia fiind varianta în care atunci
când este transmis un semnal avem valorea 1 și în rest 0. La receptor este comparată amplitudinea
pentru a detecta ce bit a fost trimis. [1] [9]
– Frequency shift keying (FSK), una dintre cele mai util izate metode, fiind necesare pentru
demodulare două oscilatoare locale, două module care realizează PSK și un comparator. [1][9]
– Phase shift keying (PSK), care necesită pentru demodulare un oscilator local, u n inversor și
un amplificator. [1] [9]

Figura 1.6 Ilustrarea tipurilor de modulație [9]
În anumite cazuri nu este de ajuns să folosim un singur mesaj modulator pentru a utiliza
eficient lățimea de bandă. QAM (Quadrature Amplitude Modulation) implică folosirea a două
semnale purtătoare, la care avem diferența de fază de 90 grade, fiecare fiind modulate cu un semnal
diferit. În cazul semnalelor digitale, fluxul de biți este împărțit în două, fiind folosite separat pentru
modularea celor două semnale purtătoare. [1] [14]
Pentru a avea o eficientă energetică crescută, este necesar ca transceiver -ul să stea cât mai
mult timp inactiv, ceea ce implică minimizarea timpului de transmisie. Unul din factorii care
influențează timpul de transmisie îl reprezintă rată de transfer, care depinde de modulația folosită. Alt
factor important este faptul că puter ea consumată depinde mai mult de viteză de simboluri (măsurată
în baud) decât de rată de transfer a biților (bit rațe, măsurat în bit/s), ceea ce înseamnă că este
preferabilă folosirea unei modulații ca 64 -QAM. Totuși acestea sunt mai puțin reziliente la z gomot și

26
interferențe, iar în cazul în care pachetele sunt de dimensiuni reduse (de ordinul zecilor sau sutelor de
biți), mai important este timpul necesar pentru reactivarea transceiver -ului. [2] [13]

1.5 Sincronizarea în timp

Rețelele de senzori wireless sunt sisteme distribuite la care fiecare nod are propriul ceas intern.
Deoarece fiecare nod funcționează independent de celelalte noduri din rețea, valorea timpului
înregistrat de un nod, la un moment dat, va fi diferită de cea a altor noduri. Timpul are un rol important
datorită interacțiunii realizate între rețeaua de senzori și mediul înconjurător. Putem considera cazul
în care este folosită o rețea de senzori pentru a detecta obiecte și pentru a stoca momentul de timp la
care au trecut pe lângă senzorii respectivi. Dacă ceasurile nodurilor nu sunt sincronizate, nu putem
stabili pe bază datelor stocate ordinea temporală a acestor evenimente. [2] [9]
Ceasurile găsite în majoritatea componentelor hardware se bazează pe efectul piezoelectric,
care reprezintă proprietatea unui cristal (de cuarț) de a genera un potențial electric, atunci când este
supus stresului mecanic, dar și de a se contracta sau extinde atunci când este aplicat un potențial
electric între fețele opuse (efectul invers). Acestea a u un contor care este decrementat la fiecare
oscilație, fiind resetat și generând o întrerupere atunci când ajunge la 0. Fiecare întrerupere
incrementează un contor ce poate fi folosit de aplicațiile software. Acest contor reprezintă timpul
local al nod ului din RSZ și va fi notat cu C(t), unde t este timpul real. [1]
Considerăm cazul în care avem două noduri. Acestea vor avea fiecare un timp local propriu,
iar diferența dintre ele va fi offset -ul. Este necesar să le sincronizăm astfel încât offset -ul să fie 0. Un
ceas perfect respectă relația dc/dt = 1 în orice moment , dar în funcție de temperatură, umiditate și
uzură cristalului de cuarț, acesta are o abatere față de timpul real. Abaterea dintre două ceasuri poate
fi exprimată prin: dc/dt -1. În general, producătorii specifică valoarea maximă pentru această abatere,
astfel încât să respecte relația:
1− 𝜌 ≤ 𝑑𝐶
𝑑𝑡≤1+ 𝜌
unde 𝜌 reprezintă abaterea maximă, măsurată în părți per milion, având valori cuprinse între 1 ppm –
100 ppm pentru ceasurile cu cuarț. Din cauza acestui fenomen, este necesar ca ceasurile nodurilor să
fie sincronizate periodic. [1] [2]
Putem distinge două tipuri de sincronizări: externă și internă. Sincronizarea externă presupune
ca toate ceasurile nodurilor sunt sincronizate cu o sursă externă, cum ar fi Coordinated Universal
Time (UTC). Cea internă nu necesită o sursă externă, nodurile fiind sincronizate între ele.
Dacă folosim ceasuri identice, oricare două ceasuri sincronizate pot avea o variație maximă
de 2𝜌𝑚𝑎𝑥. Pentru a limita offset -ul la ∆ secunde, este necesar ca intervalul de resincroni zare 𝜏𝑠𝑦𝑛𝑐 să
fie:
𝜏𝑠𝑦𝑛𝑐 ≤∆
2𝜌𝑚𝑎𝑥 [1]
Există cazuri în care nu este necesar ca ceasurile să fie sincronizate des, cum ar fi cel în care
rețeaua monitori zează evenimente ce au loc rar. În acest caz, nodurile sunt nesincronizate în

27
majoritatea timpului. Când un eveniment este observat la momentu l de timp 𝑡0, nodul 𝑖 își
înregistrează timpul local 𝐿𝑖(𝑡0) și inițializează protocolul de sincronizare, care poate implica, de
exemplu, sincronizarea cu UTC. După ce este reali zată sincronizarea la momentul 𝑡1, nodul 𝑖 află
offset -ul ∆ pe care îl are față de UTC, ținând cont de faptul că 𝑡1=𝐿𝑖(𝑡1)+ ∆. Nodul 𝑖 p oate folosi
aceaste date pentru a afla când a avut loc evenimentul observat, relativ la UTC. După ce a transmis
informațiile procesate, nodul poate reveni la un consum de energie redus, nem aifiind necesară
sincronizarea. [1] [2] [9]
Luând în considerare caracteristicile WSN, unele dintre cele mai uzuale metode propuse
pentru a realiza sincronizarea în timp nu sunt viabile:
1. Adăugarea unui modul GPS (Global Positioning System) la fiecare nod -un modul GPS
necesită o antenă separată, alimentare continuă p entru a rămâne sincronizat (iar sincronizarea inițială
poate dura până la câteva minute) și are o dimensiune mare, ceea ce nu permite realizarea unor noduri
de dimensiuni reduse. În plus, este necesar ca modulul să aibă în vizibiltiate directă cel puțin 4 sateliți.
Alt impe diment este și prețul ridicat. [1] [2]
2. Adăugarea unui receptor pentru UTC (ex. receptor DCF77) -prezintă aceleași dezavantaje
că în cazul folosirii modulelor GPS. [2]
3 . Transmiterea unor mesaje de sincronizare de către nodurile din extremitatea rețelei – poate
fi folosită în interior, dar implică comunicarea pe o frecvență separată, prin urmare, necesită un
transceiver separat pentru fiecare nod, astfel încât sincroniz area să nu afecteze transmis ia datelor
preluate de noduri. [1] [2]
În general, este necesar ca sincronizarea să fie realizată prin comunicarea între noduri, așadar
trebuie examinate întârzierile datorate transmiterii informației prin canalul wireless. Pri n urmare, între
două noduri avem următoarele patru componente care formează întârzierea:
1. Întârzierea la trimitere -timpul necesar pentru ca transmițătorul să creeze mesajul de
sincronizare și să -l trimită către interfață de rețea;
2. Intarzierea l a accesul canalului – timpul necesar pentru a accesa canalul. Este determinat de
protocolul folosit la subnivelul MAC. Daca este folsit un protocol ca CSMA poate fi introdusa o
intarziere semnificativa ;
3. Întârzierea cauzată de timpul de propagare -neglijabilă dacă transmisia este prin aer și dacă
distanță nu este foarte mare;
4 . Întârzierea la recepție -implică timpul necesar pentru a primi, procesa și notifica sistemul
de operare. [9]
Cea mai simplă formă de sincronizar e implică trimit erea mesajului 𝑡1, în care este stocat
timpul local, de la nodul 𝑖, către nodul 𝑗. Acesta din urmă va calcula diferența dintre timpul primit 𝑡1
și cel propriu , 𝑡2, pentru a afla offset -ul ∆. Putem exprima diferența între cele două momente de timp
ca:
𝑡2− 𝑡1=𝐷+∆
unde D reprezintă timpul de propagare (necunoscut). Timpul de propagare este de obicei neglijat,
având valori foarte mici (câteva microsecunde) sau considerat o valoare constantă. Putem avea o

28
precizie mai mare dacă nodul 𝑗 t rimite înapoi un mesaj în care introduce mesajul primit , 𝑡1, timpul
𝑡2 la care a pr imit mesajul inițial și timpul 𝑡3, cȃnd nodul 𝑗 transmite mesajul . Ȋn plus, nodul 𝑖 va
memora timpul 𝑡4 la care a primit mesajul . Cu acest e valori va determina offset -ul:
𝑜𝑓𝑓𝑠𝑒𝑡 =(𝑡2−𝑡1)−(𝑡4−𝑡3)
2 [1]
În acest caz este necesar ca nodu l 𝑗 să primeasc ă valoarea offset -ului de la nodul 𝑖.
Au fost dezvoltate mai multe protocoale pentru WSN bazate pe cele două metode descrise
mai sus:
1. Lightweight Tree-Based Synchronization (LTS) – este un protocol care se bazează pe o
structură de arbore pentru a realiza sincronizarea. Există două abordări prin car e este implementat
protocolul. [1] [2]
În prima variantă este construit un arbore pornind de la un nod rădăcină în așa fel încât restul
nodurilor se vor sincroniza cu nodul referință. Precizia față de nodul rădăcină va fi mai mică cu cât
un nod este mai îndepărtat în structură arborelui, din ac est motiv trebuie minimizată adâncimea. Inițial
este construit arborele și nodul rădăcină realizează sincronizarea cu nodurile descendente, acestea la
rândul lor făcând același lucru cu nodurile subordonate. Algoritmul are loc in felul urm ător: nodul 𝑗
transmite un mesaj 𝑡1, care conține timpul înregistrat înain te de a fi trimis, către nodul 𝑘; mesajul
ajunge la momentul 𝑡2, dup ă care este înregistrat momentul de timp 𝑡3 și trimis inapoi la nodul 𝑗, care
va primi mesajul la momentul de timp 𝑡4. Folosind aceste valori, offset -ul poate fi calculat în felul
urmator:
𝑜𝑓𝑓𝑠𝑒𝑡 =𝑡2−𝑡4− 𝑡1+ 𝑡3
2
unde am presupus că timpul de propagare este același în ambele direcții. Procedeu l este ilustrat în
figura 1.8. [1] [2] [9]

Figura 1.7 Protocolul LTS centralizat [1]
A doua abordare nu implică construirea unei structuri de arbore, iar sincronizarea nu va fi față
de un nod principal, ci față de mai multe noduri considerate ca referință. În plus, sincronizarea nu este
initata de un singur nod ci de oricare nod din rețea, care își va stabili perioada de sincronizarea în
funcție de precizia dorită, de distanța față de referință și de valorea abaterii ceasului. Deoarece
precizia sincronizării este invers proporțională cu distanța , cu cât un n od este mai îndepărtat de
refererinta, cu atât este necesar ca sincronizarea să fie realizată mai frecvent. [1] [2] [9]
2. Adaptive Clock Synchronization (ACS) – inițial, un transmițător difuzează m pachete de
sincronizare. Receptoarele calculează abaterea relativă prin regresie liniară și transmit rezultatele

29
trasmitatorului cu o întârziere aleasă la întâmplare pentru a evita coliziunea cu celelalte noduri. În
mome ntul în care receptorul primește mesajele va calcula offset -ul între ceasu l propriu și cel al
vecinilor. [9]

Figura 1.8 Protocolul ACS [9]
3. Protocoalele Mini -sync și Tiny -sync-sunt ușor de implementat și au un consum redus de
resurse hardware. Ambele se bazează pe o structură ierarhică a rețelei de senzori, în care fiecare nod
este sincronizat cu nodul părinte. Relația dintre ceasurile a două noduri poate fi exprimată ca:
𝐶1(𝑡)= 𝑎12𝐶2(𝑡)+𝑏12
unde 𝑎12 reprezint ă abaterea relativ ă si 𝑏12 offset -ul relativ dintre nodurile 1 si 2. Pentru a determina
parametrii din rela ția de mai sus trebuie ca nodul 1 s ă trimit ă un mesaj cu timpul 𝑡0, nodul 2 sa
răspund ă cu un mesaj 𝑡1 care va fi recep ționat de nodul 1 la momentul de timp 𝑡2, care va forma un
tuplu cu aceste valori ce vor respecta rela țiile:
𝑡0< 𝑎12𝑡1+ 𝑏12
𝑡2> 𝑎12𝑡1+ 𝑏12
Acest procedeu va fi repetat de mai multe ori pentru a obține o serie de tupluri care vor crește precizia
metodei. Algoritmul Tiny -sync păstrează p atru tupluri și le va compara cu cele rezultate din următorul
tuplu disponibil pentru a decide care trebuie păstrate. Pentru a îmbunătății precizia, algoritmul Mini –
sync renunță la un punct numai dacă acesta nu ajută. În cazul în care nodurile rețelei de s enzori au o
memorie redusă, estimarea trebuie realizată cu un număr redus de tupluri și este preferat algoritmul
Tiny -sync. Dezavantajul acestora este că nu sunt potrivite pentru sincronizarea în cazul în care
nodurile sunt mobile. [1] [2] [9]

30

31
2. MIMO în rețele de senzori wireless

2.1 Caracteristici MIMO

Tehnologiile convenționale în comunicatile wireless implică folosirea unei antene la
transmisie și a unei antene la recepție. Primele idei legate de folosirea mai multor antene la emisie și
la recepție au fost avansate de către A. R. Kaye și D.A. George (1970) și W. van Etten (1975, 1976).
Arogyaswami Paulraj și Thomas Kailath au fost primii care au propus în anul 1993 folosirea
multiplexarii spațiale utilizând rețele de t ip MIMO (Multiple Input Multiple Output), iar primul
prototip de acest fel a fost cr eat în anul 1998 la Bell Labs. Aceste tehnologii oferă o eficientă spectrală
ridicată și o creștere considerabilă a fiabilității . [17]
În timpul comunicației wireless un semnal poate ajunge la receptor prin mai multe căi, acest
fenomen numit propagare multicale. Acesta duce la fluctuații ale parametrilor semnalului
(ampltitudine, fază), care pot afecta negativ semnalul. În cazul sistemelo r de tip MIMO, aceaste
variații ale canalului radio sunt valorificate. În plus, folosirea mai multor antene permite creșterea
capacității canalului. [18] [19] [25]
Există mai multe tehnici de diversitate, printre care:
– Diversitate spațială, care implic ă folosirea mai mulor antene localizate în diferite poziții
pentru a avea copii necorelate ale aceluiași semnal la recepție. Mai poate fi folosită și pentru a crește
rata de transfer, în loc de a îmbun ătății fiabilitatea canalului. [18] [23] [25]
– Diversitate în timp, în care transmitem un mesaj la momente de timp diferite. Intervalul de
timp alocat unui transmițător ar trebui să fie gândit în așa fel încât întârzierea între copiile unui semnal
să fie mai mare ca timpul de coeren ță al canalului. Ace st fapt va duce la crearea de canale necorelate
în intervalele de timp alocate. Timpul de coerență este intervalul de timp în care două semnale aflate
la recepție sunt puternic cor elate, relativ la amplitudine. [18] [25]
– Diversitate în frecvență, care p resupune trimitrea mai multor copii ale unui semnal la
frecvențe diferite, separate intrele ele de o lățime de bandă cel puțin egală cu banda de coerență.
Banda de coerență a unui canal este gama de frecvențe în care două componente spectrale ale
semnalulu i sunt puternic core late în privinț a amplitudinii. [18] [25]
– Diversitatea în polarizare, la care recepția este real izată în același timp cu antene care au
polarizări diferite. Astfel, modificările de polarizare ale semnalelor nu afectează negativ sistem ul.
Această tehnică duce la scăderea sensibilității față de ori entarea antenelor de la emisie. [18] [19]
Toate aceste tehnici pot fi folosite individual sau pot fi combinate pentru a avea performanțe
ridicate în diferite situații.
Putem clasifica sistemele în funcție de numărul de antene în cazurile următoare (figura 2.1):
– Single Input Single Output (SISO) : 1 anten ă Tx, 1 anten ă Rx.
Este cazul standard al uui canal radio. Avantajul acestuia este dat de simplitatea sistemului, dar este
mai puter nic afectat de fenomene de interferenta in comparatie cu un sistem MIMO. [19]
– Single Input Multiple Output (SIMO) : 1 anten ă Tx, N antene Rx, f olosit în mod obișnuit
pentru a contracara fenomenul de fading.

32
– Multiple Input Single Output (MISO) : N antene Tx, 1 anten ă Rx, receptorul poate alege
semnalul optim dintre cele trimise.
– MIMO : N antene Rx, N antene Tx .
În continuare, dacă ținem cont de numărul de antene și de dispozitive, putem clasifica
sistemele MIMO în:
1. Single ușer MIMO – la care un dispozitiv cu mai multe antene comunică cu un receptor,
care are în componență mai multe antene. [17]
2. Mulți us er MIMO – la care un dispozitiv cu mai multe antene comunică simultan cu mai
multe dispozitive, care la rândul lor au una sau mai mult e antene. [17]
3. MIMO cooperativ – la care avem mai multe dispozitive cu o singură antenă, care cooperează
între ele pentru a forma un sistem cu performanțe foarte apropiate cu cel e ale unui sistem MIMO
clasic . [17]

Figura 2.1 Ilustrarea sistemelor d e transmisiune [34]

Ȋntr-un sistem MIMO avem semnalul transmis x∈ ℂ𝑁𝑡×1 exprimat ca vectorul:
𝑥=[𝑥1,𝑥2… 𝑥𝑁𝑡]𝑇
unde 𝑥𝑖(𝑡) reprezint ă fluxul de date transmis de antena i și [∙]𝑇 transpusa matricei. Ȋn acest caz, vom
avea ve ctorul semnalului recep ționat y∈ ℂ𝑁𝑟×1 , exprimat ca:
𝑦=[𝑦1,𝑦2… 𝑦𝑁𝑟]𝑇
unde 𝑦𝑗 reprezintă fluxul de date recepționat de antena j. Dacă nu este luată în considerare întârzierea
datorată transmisiunii, funcția sistemului poate fi exprimată ca:
𝑦= Η 𝑥+𝑛
unde 𝑛∈ ℂ𝑁𝑟×1 este zgomotul aditiv gaussian alb și Η matricea de r ăspuns a canalului , care poate fi
exprimat ă ca:

33
Η= (ℎ11 ⋯ ℎ1𝑁𝑡
⋮ ⋱ ⋮
ℎ𝑁𝑟1⋯ ℎ𝑁𝑟𝑁𝑡)
unde ℎ𝑗𝑖 descrie câștigul canalului între transmițătorul i și receptorul j (cȃștigul asociat canalului de
la antena de emisie i la antena de recep ție j). Ȋn cazul în care avem un sistem MIMO 3 x 3 va fi necesar
rezolvarea urm ătoarelor ecua ții pentru a afla ce s -a transmis : [17] [22] [30] [31]
𝑦1=ℎ11𝑥1+ℎ12𝑥2+ℎ13𝑥3+𝑛1
𝑦2=ℎ21𝑥1+ℎ22𝑥2+ℎ23𝑥3+𝑛2
𝑦3=ℎ31𝑥1+ℎ32𝑥2+ℎ33𝑥3+𝑛3
Putem afla vectorul x folosind:
𝑥= 𝐻−1 𝑦̅
unde 𝑦̅ reprezintă vectorul r ecepționat afectat de zgomotul 𝑛. Pentru a putea reconstitui fluxul de
date transmis, este necesar ca matricea canalului să fie inversabilă, adică este necesar ca matricea să
nu fie singulară și să fie bine condiționată. O matrice este bine condiționată atunci când pent ru un 𝑥1
apropiat ca valoare de 𝑥2 vom avea 𝑓(𝑥1) apropiat ca valoare de 𝑓(𝑥2). Pentru a putea indica dacă o
matrice este bine condiționată, este f olosește noțiunea de număr de condiționare, care indică
sensibilitatea unui sistem de ecuații liniare față de perturbații, dat de relația:
𝑘(𝐻)=‖𝐻‖‖𝐻−1‖
unde ‖∗‖ reprezint ă norma unei matrice. Vom avea: [24]
‖∆𝑥‖
‖∆𝑥+𝑥‖≤𝑘(𝐻)‖∆ 𝑦̅‖
‖∆ 𝑦̅+ 𝑦̅‖
unde ∆𝑥 reprezint ă varia ția vectorilui solu ție 𝑥 si ∆ 𝑦̅ varia ția vectorului observat la recep ție. Putem
deduce c ă o varia ție mic ă a vectorului 𝑦̅ duce la schimbări mari ale vectorului soluție dacă numărul
de condiționare este crescut. O matrice rău condiționată va duce l a un rezultat asemănător ca în cazul
unei matrice nesingulare, ceea ce nu va permite rezolvarea sistemului de ecuații liniare, adic ă nu va
putea fi aflat vectorul 𝑥. Prin urmare, nu vom putea realiza transmisia MIMO. [24] [27]

Figura 2.2 Sistem MIMO 𝑁𝑡 𝑥 𝑁𝑡 [31]

34
Prin implementarea unor tehnici care măresc diversitatea spațială, în care trimitem același flux
date prin mai multe căi, mărim fiabilitatea, dar mai există și posibilitatea implementării unor tehnici
de multiplexare spațială, în care transmitem mai multe fluxuri de date în paralel, care au o rată de
simbol mai mică față de semnalul inițial, pentru a crește rata de transfer. Pentru a putea folosi tehnici
de multiplexare spațială este necesar ca antenele să aibă un răspuns al canalului diferit de la una la
altă. În figura 2.3 putem observa ilustrarea celor două tehnici utilizate în sistemele de tip MIMO. [18]
[30]

Figura 2.3 a) Diversitate b) Multiplexare spatiala [20]

Folosind teoria transmisiunii informației, putem afla limitele de performanță ale unui sistem
de tip SISO. Acesta are o capacitate:
𝐶=𝐵 log 2(1+𝑆𝑁𝑅 ) [b/s]
care poate fi scris ă ca:
𝐶=𝐵 log 2(1+|ℎ|2𝑆𝑁𝑅 ) [b/s/Hz]
unde |ℎ|2 reprezintă câștigul canalului. Informațiile despre starea canalului (Channel State
information) nu variază în cazul acesta. În cazul sistemelor de tip MIMO, CSI influențează
capacitatea canalulu i într -o măsură considerabilă.
Considerăm cazul în care este cunoscut CSI la recepție (CSIR), și vom avea două cazuri în
funcție de informațiile despre star ea canalului la emisie (CSIT): [17] [22] [24]
1. cu CSIT – cu capacitatea:
C = max
𝑄,𝑡𝑟(𝑄)≤𝑃𝑙𝑜𝑔 2(det (𝐼𝑁𝑟+𝜌
𝑁𝑡𝐻𝑄𝐻𝐻))
unde 𝐼𝑁𝑟 reprezint ă matricea ident itate de dimensiuni 𝑁𝑟×𝑁𝑟, Q matricea d e covarianță asociată
intrării (în cazul nostru, un vector aleator 𝑁𝑡-dimensional) , tr(Q) urma matricei (puterea total ă emis ă),
limitat ă de puterea P . Pentru a avea o capacitate maximă în acest caz, este necesară alegerea unei
matrice de corelație optimă.
2. fara CSIT – cu capacitatea:
𝐶= 𝐸𝐻[𝑙𝑜𝑔 2(det (𝐼𝑁𝑟+𝜌
𝑁𝑡𝐻𝐻𝐻))]
În acest caz, vom putea maximiza capacitatea dacă toate antenele vor transmite cu o putere egală,
matricea de covarianță devenind matricea identitate . [17]

35
2.2 MIMO Virtual

Luând în considerare că tehnologiile de tip MIMO oferă posibilitatea de a crește capacitatea
unui canal, dar și de a reduce consumul de energie necesar în comunicațiile wireless, s -au realizat
numeroase cercetări în ultimii ani pentru a dezvolta rețele de senzori wireless care utilizeaza MIMO .
Totuși, nodurile unei WSN trebuie să aibă o dimensiune redusă, ceea ce nu permite plasarea mai
multor antene pe un singur nod, din acest motiv pentru a forma o WSN de tip MIMO, nodurile trebuie
să coopereze la transmiterea și recepția informației, formând u n sistem MIMO virtual. Nodurile
apropiate vor fi grupate astfel încât comunicarea într -un grup să aibă un consum de energie redus,
față de comunicarea între grupuri. Pentru că avem o cooperare între noduri, trebuie să considerăm și
consumul de energie al a cestui proces. Dacă este considerată numai energia necesară pentru realizarea
transmisiunii, s -a observat că în multe cazuri, o distanță mai scurtă este preferabilă, dar, considerând
consumul energetic total, adică incluzând și restul circuitelor sistemulu i, distanța minimă pentru a
avea un consum optim nu este mică. [17] [25] [29]
În lucrarea [28] s -a analizat presupunerea des întâlnită în lucrările care analizează consumul
de energie în WSN, și anume, că sistemele de tip MIMO sunt mai eficiente energetic decât sistemele
SISO în canale cu fading Rayleigh. Folosind ca tip de modulație BPSK, se arată că în aplicațiile care
au transmisii pe distante scurte, sistemele SISO sunt mai eficiente, dar poate fi îmbunătățită
performanța sistemelor MIMO semnificativ d acă se alege o dimensiune a constelației
corespunzătoare. Este analizat și cazul în care este folosită cooperarea între noduri și se arată că de la
o distanță suficient de mare (în cazul acesta, o distanță mai mare de 100 m), sistemul este viabil.
În lucr area [30] s -a analizat consumul energetic total al WSN care utilizează coduri bloc
spatio -temporale și s -a indicat că în cazul sistemelor fără transmisie multi -hop este preferabilă
creșterea numărului de noduri transmițătoare față de cele receptoare, din c auza consumul de energie
redus necesar pentru cooperare. S -a mai arătat că sistemele MISO și MIMO cooperative sunt mai
eficiente decât sistemele SISO, chiar și în cazul în care se utilizează o transmisie SISO multi -hop,
atâta timp cât distanța este foarte mare. În particular, un sistem cooperativ multi -hop MIMO 2 x 2
este preferabil.

36

37
3. Realizarea practică

3.1 Descriere Componente

Proiectul a constant în realizarea unei transmisiuni de tip MIMO cooperativ pentru a obține
un consum redus de energie și în proiectarea unei interfațări hardware între componentele utilizate.
Nodurile rețelei de senzori dezvoltată sunt formate din următoarele componente: o placă de
dezvoltare Arduino Pro Mini și un transceiver nRF24l0 1(+). Unul dintre noduri are, în plus, senzorul
Sensirion SHT75.

Figura 3.1 Schem ă conectare componente la un nod cu senzor
Placa de dezvoltare folosită este cea mai mică placă Arduino bazată pe microcontrolerul
ATmega328, fiind preferabilă față de alte modele, ca Arduino Uno, pentru a putea crea noduri cu
dimensiuni cât mai mici. Pentru a reduce consumul de energie și a micșora dispozitivul, dezvoltatorii
au eliminat convertorul serial -USB (care consumă constant până la 15 m A), fiind necesar un cablu
FTDI pentru a -l programa. A fost ales modelul cu cristalul care funcționează la frecvența de 8 Mhz
cu o tensiune de operare de 3.3 V (celălalt funcționând la 16 Mhz/5V) pentru a micșora consumul de
energie. Placa are un LED care nu poate fi oprit prin softwa re, dar poate fi folosită o pompă de dezlipit
pentru a elimina fludorul. Există mai multe moduri de funcționare la ATmega328, printre care, modul
power -down, care salvează regiștrii, oprește oscilatorul și dezactivează toate funcțiile, cu excepția
WDT (wat chdog timer), până când are loc o întrerupere sau o resetare . [35]
Transceiverul utilizat operează în banda ISM (Industrial, Scientific and Medical) de 2.4 GHz
și a fost dezvoltat în mod special pentru aplicații care necesită un consum redus de energie. M odulul

38
poate transmite date până la o distanță de 80 m, trebuie alimentat la o tensiune de 3.3 V, comunică cu
microcontroler prin interfața SPI și are o lățime de bandă de 1 Mhz. Consumul de curent poate fi
redus până la 900 n A în modul de funcționare powe r down, când dispozitivul nu poate recepționa sau
transmite date. În modul de așteptare are un consum de 26 𝜇A, 13.1 m A când este în modul de
recepționare cu 1 Mbps și 11.3 mA la emisie cu puterea de 0 dBm. [36]
Senzorul este folosit pentru a afla temperatura și umiditatea. Are un consum redus de energie,
poate mă sura temperatura în intervalul −40𝑜𝐶−123 .8𝑜𝐶 și are o acuratețe de măsurare a
temperaturii de ±0.3𝑜𝐶 și ± 1.8 % pentru umiditate . Poate realiza o măsurătoare cu o precizie de
12/14 biți pentru temperatură și 8/12 biți pentru umiditate. Acestea durează 20/80/320 ms în funcție
de precizie. Pentru a reduce timpul necesar unei măsur ători, a fost redusă precizia. [37]

3.2 Implementare

Tehnicile MIMO de tip cooperativ sunt folosite în WSN datorită faptului că ajută la reducerea
consumului de energie la emisie, acesta fiind, în general, procesul care necesită cea mai mare cantitate
de energie. Avem nevoie de astfel de tehnologii pentru că nu putem adaugă mai multe antene într -un
nod, din cauza constrângerilor d e spațiu , pentru a crește rata de transmisie utilizând tehnici de
multiplexare spațială, dar și fiabilitatea transmisiei. În figura 3.1 este ilustrată transmisiunea MIMO
cooperativă implementată în această lucrare. Montajul fizic realizat e ste găsit în Anexa 1, iar codul
sursă complet în Anexa 2 .

Figura 3.2 Transmisie MIMO cooperativ ă
În prima fază, nodul sursă S (echipat cu senzorul de umiditate și temperatură) transmite un
mesaj de tip broadcast către nodurile 𝑇1 si 𝑇2. În continuare, semnalul este demultiplexat în două
fluxuri de date de rată inferioară, fiecare nod transmițând ma i departe doar unul dintre cele două
fluxuri. Mai departe, 𝑇1 și 𝑇2 vor transmite un mesaj broadcast către nodurile 𝑅1 și 𝑅2. Ȋn final,
fluxurile vor fi multiplexate de fiecare nod în parte și vor transmite mesajul c ătre nodul destina ție D.
Pentru a reduce consumul de energie, este necesar ca toate nodurile, cu excepția nodului D,
care va fi conectat la un calculator pentru a prelua măsuratorile luate, să nu fie active în modul clasic

39
de operare pe toată durată funcționării. Nodul S va prelua datele de la senzori și va trimite mesajul,
urmȃnd ca microcontrol er-ul să fie pus in modul power -down pentru 2 secunde folosind WDT .
Nodurile 𝑇1 și 𝑇2 ascultă inițial pâ nă când primesc un mesaj de la nodul S, îl transmit mai departe,
între ele fiind fixat un interval scurt pentru a evita coliziuniile, după care intră în modul power -down
pentru 1.5 secunde. Nodurile 𝑅1 și 𝑅2 primesc pachetele și le transmit lui D, urm ȃnd sa fie d ezactivate
un interval de 1.5 secunde . Transceiver -ele v or fi și ele dezactivate cat timp microcontrollere stau in
modul power -down.
Se poate observa în figurile 3.3 -3.9 din subcapitolul 3.3 consumul rezultat în urma
implementării algoritmului prezentat. Folosind rezultatele obținute putem calcula consumul fiecărui
nod:
1. nodul S – modul activ : 313 .2 𝜇𝐴𝑠
86.48 𝑚𝑠=3.246 𝑚𝐴
modul power -down : 14.13 𝜇𝐴𝑠
59.98 𝑚𝑆=235 .971 𝜇𝐴
2. nodul T1- modul activ : 12.83 𝑚𝐴𝑠
656 .8 𝑚𝑠= 19.534 mA
modul power -down : 1.966 𝑚𝐴𝑠
800 .8 𝑚𝑆=2.455 𝑚𝐴
3. nodul R1 – modul activ : 12.68 𝑚𝐴
658 .8 𝑚𝑠=19.2 𝑚𝐴
modul power -down : 1.629 𝑚𝐴𝑠
600 .8 𝑚𝑆=2.711 𝑚𝐴
Ȋn continuare am folosit urm ătoarele rela ții:
Capacitate consumat ă în power -down [mAs] = Consum power -down [mA] * durat ă power -down [s]
Capacitate consumat ă în modul activ [mAs] = Consum activ [mA] * durat ă activ [s]
Capacitate consumat ă total [mAs] = Capacitate consumat ă power -down [mAs] + Capacitate consumat ă în
modul activ [mAs]
Capacitate consumat ă [mAs] = Capacitate Consumat ă total [mAs] / 3600
Durata total ă [ore] = Capacit ate consumata [mAs] / (3600 / durata in modul power -down)
Durat a totală [zile] = Durat a totală [ore] / 24

Utiliz ȃnd o baterie Li -ion de 3.7 V cu o capacitate de 1200 mAh vom avea :
Durat a de viață a nodului S = 127.38 zile
Durata de viață a nodului T1 = 4.542 zile
Durata de viață a nodului 𝑅1 = 4.497 zile
Ȋn modul power -down nodurile ar trebui să consume aproximativ la fel, dar in cazul acesta
putem observa c ă acest lucru nu se întȃmplă. Acest fenomen are loc pentru c ă, față de nodul S,
nodurile T1 și R1 au ledul care indic ă funcționarea pl ăcii Arduino aprins constant. Așadar putem face

40
diferen ța între consumul în modul power -down al nodului S cu cel al nodului T1, ajung ȃnd la un
consum de aproximativ 2.2 mA pentru a men ține ledul aprins. Nefiind necesar ledul respectiv in
funcționarea retelei, vom calcula dur ata de funcționare fără a-l lua în calcul. Ȋn final, vom avea:
Durata de viață a nodului 𝑇1 = 6.389 zile
Durata de viață a nodului 𝑅1 = 6.492 zile
Diferența mare comparati v cu nodul S este dată de durata de timp mult mai mare în care
nodurile s e află în modul de recepționare. Nodurile T2 și R2 vor avea aproximativ acela și consum
energetic ca T1 și R1.
Trebuie luat în considerare faptul că s -au transmis foarte puține date, mesajul inițial fiind
doar un pachet de 32 bytes . Dacă s -ar testa și o transmitere de tip SISO (multi -hop) cel mai prob abil
am observa că este mai eficientă energetic . Eficien ța crescută față de SISO o vom observa dacă vom
transmite mult mai mu lte date, ca de exemplu, imagini , conținut video etc. .
Codul sursă al nodului S:
#include <SPI.h> // adăugăm libr ăria SPI pentru a putea comunica cu transceiver -ul

// adăugăm librăriile pentru modulul RF
#include <nRF24L01.h>
#include <RF24.h>

#include "printf.h" // permite afi șarea detaliilor legate de transceiver -ul conectat
#include <Sensirion.h> // adăugăm librăria pentru senzorul SHT75

// adăugăm librăriile necesare pentru a folosi modul power -down
#include <avr/sleep.h>
#include <avr/wdt.h>

// pini i conecta ți la transceiver
const int pinCE = 9;
const int pinCSN = 10;

int32_t payload;
float temp, hum, dewpoint;

// pinii conecta ți la senzorul SHT75
const uint8_t dataPin = 3;
const uint8_t clockPin = 4;

RF24 radio (pinCE, pinCSN); // creare instan ță RF24 cu care va fi configurat transceiver -ul
Sensirion sensor = Sensirion(dataPin, clockPin); // creare instan ță senzor SHT75
const uint64_t wpAddress[] = {0xCB 1C1E500ALL } ; // adresa unde vor fi trimis e datele

void setup() {
sensor .writeSR(1); // scriere în registrul Status Register pentru a mic șora precizia m ăsurătorilor
Serial.begin(9600 );
printf_begin ();
radio.begin(); // pornire transceiver
radio .setDataRate(RF24_1MBPS); // setarea vitezei de transmisie ( și recep ție) la 1 Mbps
radio.setChannel(105); // setare canal de comunica ție (2.505 Ghz)
radio.setPALevel(RF24_PA_LOW /*-12 dBm*/ ); // setare putere transmisie ; exist ă patru niv eluri: -18 dBm, -12 dBm, -6 dBm, și
// 0 dBm
radio .enableDynamicAck(); // necesar ȃ pentru a realiza transmisii multicast
radio .openWritingPipe(wpAddress[0]); // deschidere canal cu adresa introdus ă
radio .printDetails (); // afișează informatii despre transceiver

41
delay(2000 /* ms */ ); // asteptare de 2 s
}
void loop() {
payload = getPayload(); // functia care returneaza masuratorile dupa ce au fost combi nate (multiplexate) intr -un singur pachet
radio .write(&payload, 4, 1); // trimitere mesaj
// functia de afisare pe monitorul serial nu este blocanta, iar nodul poate intra in power -down inainte de a afisa datele
// preluate in functia getPayload()
Serial.flush();
radio .powerDown(); // punem transceiver -ul in modul de consum energetic redus (900 nA)
delayWDT(WDTO_2S); // punem microcontrolerul in modul power down pentru aproximativ 2 s
radio .powerUp();
}

/* preluare temperatura si umiditate de la senzor
* combinarea datelor intr -un singur pachet
*/
int32_t getPayload() {
tempSensor.measure(&temp, &hum, &dewpoint);
Serial.print("Temp: ");
Serial.println(temp);
Serial.print("Hum: ");
Serial.println(hu m);
temp = temp * 100;
hum = hum * 100;
int16_t T = (int16_t) temp;
int16_t H = (int16_t) hum;
int32_t payload1 = T;
payload1 = (payload1 << 16) + H;
return payload1;
}

// functia care pune microcontrolerul in modul power -down
// este folosi t modul cel mai eficient energetic
void delayWDT(byte time) {
sleep_enable(); // activam functia de sleep
set_sleep_m ode(SLEEP_MODE_PWR_DOWN); // setam modul de functionare
ADCSRA &= ~(1 << ADEN); // setam bitul ADEN 0 pentru a opri ADC
WDTCSR |= 0b00011000;
WDTCSR = 0b01000000 | time ; // setam prescalarul WDT
wdt_reset(); // resetam WDT
sleep_cpu(); // intrare in modul power -down pana cand va fi realizata o in trerupe re sau pana cand ajunge la 0 contorul WDT
sleep_disable(); // dezactivam modul sleep
ADCSRA |= (1 << ADEN); // repornire modul ADC
}

// functia apelata atunci cand contorul WDT s -a terminat
ISR (WDT_vect) {
wdt_disable();
MCUSR = 0;
}

42
3.3 Rezultate m ăsurători

Figura 3.3 Nod S Activ

Figura 3.4 Nod S – Power d own

43

Figura 3. 5 Nod S – Puls transmisie

Figura 3.6 Nod 𝑇1 – Activ

44

Figura 3.7 Nod 𝑇1 – Power -down

Figura 3.8 Nod 𝑅1 – Activ

45

Figura 3.9 Nod 𝑅1 – Power -down

46
3.4 Proiectarea interfeței de interconectare hardware

Interfața hardware a fost creată în mediul de dezvoltare CadSoft Eagle. În figura 3.9 avem
schema electrică, iar în figura 3.10 avem cablajul imprimat. Pentru a realiza cablajul sunt necesare
următoarele: o imprimantă laser pentru imprimarea cablajului, un fier de călcat, un cablaj textolit, și
clorură ferică pentru corodarea plăcii (este preferabil să aibă o temperatură ridicată).
În urma realizării cablajului în CadSoft Eagle, acesta trebuie imprimat pe o coală lucioasă,
folosind o imprimantă laser. Trebuie tăiată placă de textolit astfel încât să avem dimensiunea necesară
cablajului. În continuare, trebuie folosit un fier de călcat pentru a transpune tonerul de pe foaie pe
cablaj. După o perioadă de timp ar trebuie ca tra seele să fie imprimate pe plăcută. În final, trebuie
pusă plăcuța într -un vas cu clorură ferică pentru câteva zeci de minute și, după ce este curată placa,
pot fi realizate găurile necesare.

Figura 3.10 Schema electrică interfață hardware

Figura 3.1 1 Cablaj imprimat interfață hardware a) strat bottom b) strat top c) ambele straturi

47

Figura 3.1 2 Cablaj textolit

Figura 3.1 3 Placa textolit după așezarea foii cu cablaj

48

Figura 3.1 4 Folosirea fierului de c ălcat pentru transpunerea tonerului

Figura 3.1 5 Cablajul cu traseele imprimate

49

Figura 3.1 6 Cablajul imprimat în soluția de clorură ferică

50

51
Concluzii

În urma realizării acestui proiect, am dezvoltat o transmisiune multi -hop de tip MIMO cooperativ
utilizând componente care au un cost redus (o placă de dezvoltare Arduino Pro Mini împreună cu un
transceiver nRF24l01 pot fi cumpărate cu 20 lei) și o interfa ță de interconectare hardware. Folosind
funcțiile disponibile ale microcontrolerului și ale transceiver -ului am prelungit durata de viață, astfel
încât, folosind o baterie Li -ion de 1200 mah aplicația poate funcționa aproape 6 zile.
Dacă este necesar, se pot folosi și alte tehnici pentru a reduce consumul unui nod. În funcție
de aplicația utilizată, putem recurge și la următoarele metode: scăderea frecvenței și tensiunii de
operare a microcontrolerului, dezactivarea completă a unor module (interfață se rială, convertorul
analog -digital etc.), oprirea funcției brownout detection, oprirea WDT, schimbarea stabilizatorului de
tensiune sau dezactivarea lui.
În continuare, consider că ar trebui implementate protocoale de rutare astfel încât rețeaua de
senzori să asigure că datele transmise ajung la destinație în orice situație cât timp există o rută. Ar
mai trebui redus timpul de funcționare în modul de recepționare al nodurilor și dezvoltarea unui cablaj
imprimat la care se vor adaugă doar componentele ne cesare rețelei de senzori, deoarece placă de
dezvoltare are multe componente care cresc semnificativ consumul de energie.

52

53
Bibliografie

1. Waltenegus Dargie and Christian Poellabauer. 2010. Fundamentals of Wireless Sensor Networks: Theory and Practice.
Wiley Publishing.
2. Karl, H., & Willig, A. (2005). Protocols and architectures for wireless sensor networks. Wiley.
3. I. F. Akyildiz, W. Su, Y. Sankarasubramaniam, and E. Cayirci, “A Survey on Sensor Networks,” Computer Networks,
2002, pp. 393 -422
4. http://people.eecs.berkeley.edu/~prabal/teaching/cs294 -11-f05/slides/day21.pdf accesat la data 28.06.2016
5. G. Hoblos, M. Staroswiecki, A. Aitouche, Optimal design of fault tolerant sensor networks, IEEE International
Conference on Control Applications, Anchorage, AK, September 2000, pp. 467 –472.
6. N. Bulusu, D. Estrin, L. Girod, J. Heidemann, Scalable coordination for wireless sensor networks: self -configuring
localization systems, International Symposiu m on Communication Theory and Applications (ISCTA 2001), Ambleside,
UK, July 2001.
7. Yunxia Chen, Chen -Nee Chuah and Qing Zhao, "Sensor placement for maximizing lifetime per unit cost in wireless
sensor networks," MILCOM 2005 – 2005 IEEE Military Communic ations Conference, Atlantic City, NJ, 2005, pp. 1097 –
1102 Vol. 2.
8. K. Romer and F. Mattern, "The design space of wireless sensor networks," in IEEE Wireless Communications, vol. 11,
no. 6, pp. 54 -61, Dec. 2004. doi: 10.1109/MWC.2004.1368897
9. Akyildiz, I. F., & Vuran, M. C. (2010). Wireless sensor networks. Wiley Publishing .
10. K. Sohraby, D. Minoli, T. Znati, “Wireless Sensor Networks: Technology, Protocols, and Applications ”, Wiley
Publishing
11. M. Bokare, A. Ralegaonkar, “Wireless Sensor Network”, I nternational Journal of Computer Engineering Science
(IJCES), Volume 2 Issue 3 (March 2012)
12. Adrian Perrig, Robert Szewczyk, J. D. Tygar, Victor Wen, and David E. Culler. 2002. SPINS: security protocols for
sensor networks. Wirel. Netw. 8, 5 (September 2002), 521 -534.
13.http://www.radio -electronics.com/info/rf -technology -design/quadrature -amplitude -modulation -qam/8qam -16qam –
32qam -64qam -128qam -256qam.php accesat la data 28.06.2016
14. http://89.46.161.13/glosarweb/termeni/qam,%20modulatie.htm accesat la data 28.06.2016
15. V. Raghunathan, C. Schurgers, S. Park, and M. B. Srivastava. Energy -Aware Wireless Microsensor Networks. IEEE
Signal Processing Magazine, 19: 40 –50, 2002.
16. Bharath Sundararaman, Ugo Buy, Ajay D. Kshemkalyani, Clock synchronization fo r wireless sensor networks: a
survey, Ad Hoc Networks, Volume 3, Issue 3, May 2005, Pages 281 -323, ISSN 1570 -8705,
http://dx.doi.org/10.1016/j.adhoc.2005.01.002 .
17. Wen, Xiaojun. "Distributed MIMO for wireless sensor networks." (2011)
18. http://www.gaussianwaves.com/2014/08/introduction -to-multiple -antenna -systems/

54
19. http://www.radio -electronics.com/info/antennas/mimo/multiple -input -multiple -output -technology -tutorial.php
20. http://www.gaussianwaves.com/2014/08/mimo -diversity -and-spatial -multiplexing accesat la data 28.06.2016
21. Ben Zid Maha and Raoof Kosai (2013). Multi User MIMO Communication: Basic Aspects, Benefits and
Challenges, Recent Trends in Multi -user MIMO Communi cations, Ph.D. Maha Ben Zid (Ed.), InTech, DOI:
10.5772/57133.
22. http://www.gaussianwaves.com/2014/11/capacity -of-a-mimo -system -over-fading -channels/ accesat la data
28.06.2016
23. Sandhu, S., Nabar, R., Gore, D., & Paulraj, A. (2003). Introduction to S pace-Time codes. Applications of Space –
Time Adaptive Processing, IEE Publishers http://www. stanford. edu/group/sarg/sandhu062503. pdf
24. http://www.gaussianwaves.com/2014/08/characterizing -a-mimo -channel/ accesat la data 28.06.2016
25. M. Ahmad, “Cooper ative MIMO communications in wireless sensor networks” (2008)
26. http://people.rennes.inria.fr/Olivier.Sentieys/publications/2007/NBS07.pdf accesat la data 29.06.2016
27. http://www.utgjiu.ro/math/mbuneci/book/mn2007/c06.pdf accesat la data 26.06.2016
28. Shuguang Cui, A. J. Goldsmith and A. Bahai, "Energy -efficiency of MIMO and cooperative MIMO techniques in
sensor networks," in IEEE Journal on Selected Areas in Communications, vol. 22, no. 6, pp. 1089 -1098, Aug. 2004.
29. Meethu Abraham. "Mimo And Coo perative Mimo Comparison In Energy Constrained Wireless Sensor Networks."
International Journal of Research in Engineering and Technology IJRET 04.04 (2015): 566 -70. Web.
30. http://web.stanford.edu/group/sarg/sandhu062503.pdf accesat la data 2 1.06.2016
31. T. D. Nguyen, O. Berder and O. Sentieys, "Cooperative MIMO Schemes Optimal Selection for Wireless Sensor
Networks," 2007 IEEE 65th Vehicular Technology Conference – VTC2007 -Spring, Dublin, 2007, pp. 85 -89.
32. Cho, Y. S., Kim, J., Yang, W. Y. and Kang, C. G. (2010) References, in MIMO -OFDM Wireless Communications
with MATLAB®, John Wiley & Sons, Ltd, Chichester, UK.
33. http://www.ni.com/white -paper/14931/ accesat la data 21.06.2016
34. http://www.evercom.com.tw/proimages/image001.gif accesat la data 2 2.06.2016
35. Atmega 328 Datasheet
36. nRF24l01 Datasheet
37. Sensirion SHT75 Datasheet

55
Anexe

Anexa 1 . Montajul realizat

56
Anexa 2 . Codul surs ă

Nod S

#include <SP I.h>
#include <nRF24L01.h>
#include <RF24.h>
#include "printf.h"
#include <Sensirion.h>
#include <avr/sleep.h>
#include <avr/wdt.h>

const int pinCE = 9;
const int pinCSN = 10;
int32_t payload;
float temp, hum, dewpoint;
unsigned long timer1, timer2;
const uint8_t dataPin = 3;
const uint8_t clockPin = 4;
RF24 radio(pinCE, pinCSN);
Sensirion tempSensor = Sensirion(dataPin, clockPin);
const uint64_t wpAddress[] = {0xCB0B1E500ALL } ;

void setup()
{
wdt_disable();
temp Sensor.writeSR(1);
Serial.begin(9600);
radio.begin();
radio.setDataRate(RF24_1MBPS);
radio.setChannel(105);
radio.setPALevel(RF24_PA_LOW);
radio.enableDynamicAck();
radio.openWritingPipe(wpAddress[0]);
delay(2000);
}

void loop()
{
payload = getPayload();
radio.write(&payload, 4, 1);
Serial.flush();
radio.powerDown();
delayWDT(WDTO_2S);
radio.powerUp();

57
}

int32_t getPayload() {
tempSensor.measure(&temp, &hum, &dewpoint);
Serial.print("Temp: ");
Serial .println(temp);
Serial.print("Hum: ");
Serial.println(hum);
temp = temp * 100;
hum = hum * 100;
int16_t T = (int16_t) temp;
int16_t H = (int16_t) hum;
int32_t payload1 = T;
payload1 = (payload1 << 16) + H;
return payload1;
}

void delayWDT(byte timer) {
sleep_enable();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
ADCSRA &= ~(1 << ADEN);
WDTCSR |= 0b00011000;
WDTCSR = 0b01000000 | timer;
wdt_reset();
sleep_cpu();
sleep_disable();
ADCSRA |= (1 << ADEN);
}

ISR (WDT_vect)
{
wdt_disable();
MCUSR = 0;

}
Nod T1

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include "printf.h"
#include <avr/sleep.h>
#include <avr/wdt.h>

const int pinCE = 9;

58
const int pinCSN = 10;
int32_t temperature;
unsigned long time1, time2;
int timer = 1;
int firstTransmission = 0;
RF24 radio(pinCE, pinCSN);
const uint64_t wAddress[] = { 0xCB0B1E50D1LL };
const uint64_t rAddress[] = { 0xCB0B1E500ALL };

void setup()
{
Serial.begin(9600);
printf_begin();
radio.begin();
radio.setDataRate(RF24_1MBPS);
radio.setChannel(105);
radio.setPALevel(RF24_PA_LOW);
radio.enableDynamicAck();
radio.openWritingPipe(wAddress[0]);
radio.openReadingPipe(1, rAddress[0]);
radio.startListening();
}

void loop()
{
float te mp;
while (radio.available()) {
radio.read(&temperature, 4);
temp = getTemp(temperature);
Serial.print("Temperature: ");
Serial.println(temp);
radio.stopListening();
radio.setDataRate(RF24_250KBPS);
radio.openWritingPipe(wAddress[0]);
radio.write(&temp, sizeof(float), 1);
radio.setDataRate(RF24_1MBPS);
Serial.flush();
radio.powerDown();
delayWDT(WDTO_1S);
delayWDT(WDTO_500MS);
radio.powerUp();
}
radio.startListening ();
}

float getTemp (int32_t payload) {

59
payload = (payload >> 16);
float temp = payload / 100.0;
return temp;
}

void delayWDT(byte timer) {
sleep_enable();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
ADCSRA &= ~(1 << ADEN);
WDTCSR |= 0b00011000;
WDTCSR = 0b01000000 | timer;
wdt_reset();
sleep_cpu();
sleep_disable();
ADCSRA |= (1 << ADEN);
}

ISR (WDT_vect)
{
wdt_disable();
MCUSR = 0;

}
Nod T2

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include "printf.h"
#include <avr/sleep.h>
#include <avr/wdt.h>

const int pinCE = 9;
const int pinCSN = 10;
int32_t humidity;
unsigned long time1, time2;
int timer = 1;
int firstTransmission = 0;
RF24 wirelessSPI(pinCE, pinCSN);
const uint64_t wAddress[] = { 0xCB0B1E50D5LL };
const uint64_t rAddress[] = { 0xCB0B1E500ALL };

void setup()

60
{
Serial.begin(9600);
printf_begin();
wirelessSPI.begin();
wirelessSPI.setDataRate(RF24_1MBPS);
wirelessSPI.setChannel(105);
wirelessSPI.setPALevel(RF24_PA_LOW);
wirelessSPI.enableDynamicAck();
wirelessSPI.setRetries(5, 15); // Defines packet retry behavior: first arg is delay between retries at 250us x 5 and max no.
of retries
wirelessSPI.openWritingPipe(wAddress[0]);
wirelessSPI.open ReadingPipe(1, rAddress[0]);
// wirelessSPI.stopListening();
// wirelessSPI.printDetails();
wirelessSPI.startListening();
}

void loop() {
float hum;
while (wirelessSPI.available()) {
wirelessSPI.read(&humidity, 4);
hum = getHum(humidity);
Serial.print("Humidity: ");
Serial.println(hum);
wirelessSPI.stopListening();
wirelessSPI.setDataRate(RF24_250KBPS);
wirelessSPI.openWritingPipe(wAddress[0]);
wirelessSPI.write(&hum, sizeof(float), 1);
wirele ssSPI.setDataRate(RF24_1MBPS);
Serial.flush();
wirelessSPI.powerDown();
delayWDT(WDTO_1S);
delayWDT(WDTO_500MS);
wirelessSPI.powerUp();
}
wirelessSPI.startListening();
delay(25);
}

float getHum (int32_t payload) {
payload = payload & 0xFFFF;
float temp = payload / 100.0;
return temp;
}

void delayWDT(byte timer) {

61
sleep_enable();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
ADCSRA &= ~(1 << ADEN);
WDTCSR |= 0b00011000;
WDTCSR = 0b01000000 | timer;
wdt_res et();
sleep_cpu();
sleep_disable();
ADCSRA |= (1 << ADEN);
}

ISR (WDT_vect)
{
wdt_disable();
MCUSR = 0;

} Nod 𝑅1

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <avr/sleep.h>
#include <avr/wdt.h>

const int pinCE = 9;
const int pinCSN = 10;
bool gotTemp = false;
bool gotHum = false;
float temp;
float hum;
boolean tr = true;
int32_t payload;
unsigned long timer1, timer2;
RF24 radio(pinCE, pinCSN);
const uint64_t rAddress[] = { 0xCB0B1E50D1LL, 0xCB0B1E50D5LL };
const uint 64_t wAddress[] = { 0xAB3128E3C1LL };

void setup() {
Serial.begin(9600);
radio.begin();
radio.setDataRate(RF24_250KBPS);
radio.setChannel(105);
radio.setPALevel(RF24_PA_LOW);
radio.enableDynamicAck();
radio.setRetries(5, 15);

62
radio.openReadingPipe(1, rAddress[0]);
radio.openReadingPipe(2, rAddress[1]);
radio.startListening();
}

void loop() {
uint8_t pipeNum;
if (radio.available(&pipeNum)) {
tr = true;
Serial.println(pipeNum);
if (pipeNum == 1) {
gotTemp = true;
radio.read(&temp, sizeof(float));
Serial.print("Temperature: ");
Serial.println(temp);
}
else {
gotHum = true;
radio.read(&hum, sizeof(float));
Serial.print("Humidity: ");
Serial.println(hum);
}
timer1 = millis();
if (gotTemp && gotHum) {
gotTemp = false;
gotHum = false;
payload = getPayload(temp, hum, false);
radio.stopListening();
radio.setDataRate(RF24_1MBPS);
radio.openWritingPipe(wAddress[0]);
radio.write(&payload, 4);
radio.setDataRate(RF24_250KBPS);
Serial.flush();
radio.powerDown();
delayWDT(WDTO_1S);
delayWDT(WDTO_500MS);
radio.powerUp();
radio.startLis tening();
}
}
if (millis() – timer1 > 100 && !tr) {
payload = getPayload(temp, hum, true);
gotTemp = false;
gotHum = false;
radio.stopListening();
radio.setDataRate(RF24_1MBPS);

63
radio.openWritingPipe(wAddress[0]);
radio. write(&payload, 4);
radio.setDataRate(RF24_250KBPS);
Serial.flush();
radio.powerDown();
delayWDT(WDTO_1S);
delayWDT(WDTO_500MS);
radio.powerUp();
radio.startListening();
tr = false;
}
}

int32_t getPayload(float temp, float hum, boolean lostPacket) {
if (lostPacket) {
if (gotTemp) {
temp = temp * 100;
hum = 2;
} else {
temp = 2;
hum = hum * 100;
}
} else {
temp = temp * 100;
hum = hum * 100;
}
int16_t T = (int16_t) temp;
int16_t H = (int16_t) hum;
int32_t payload = T;
payload = (payload << 16) + H;
return payload;
}

void delayWDT(byte timer) {
sleep_enable();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
ADCSRA &= ~(1 << ADEN);
WDT CSR |= 0b00011000;
WDTCSR = 0b01000000 | timer;
wdt_reset();
sleep_cpu();
sleep_disable();
ADCSRA |= (1 << ADEN);
}

64
ISR (WDT_vect) {
wdt_disable();
MCUSR = 0;
}
Nod R2

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <avr/sleep.h>
#include <avr/wdt.h>

const int pinCE = 9;
const int pinCSN = 10;
bool gotTemp = false;
bool gotHum = false;
float temp;
float hum;
boolean tr = true;
int32_t payload;
unsigned long timer1, timer2;
RF24 radio(pinCE, pinCSN);
const ui nt64_t rAddress[] = {0xCB0B1E50D1LL, 0xCB0B1E50D5LL};
const uint64_t wAddress[] = {0xAB3128E3C2LL };

void setup() {
Serial.begin(9600);
radio.begin();
radio.setDataRate(RF24_250KBPS);
radio.setChannel(105);
radio.setPALevel(RF24_PA_LOW);
radio.enableDynamicAck();
// radio.setRetries(5, 15);
radio.openReadingPipe(1, rAddress[0]);
radio.openReadingPipe(2, rAddress[1]);
radio.startListening();
}

void loop() {
uint8_t pipeNum;
if (radio.available(&pipeNum)) {
tr = t rue;
Serial.println(pipeNum);
if (pipeNum == 1) {
gotTemp = true;
radio.read(&temp, sizeof(float));

65
Serial.print("Temperature: ");
Serial.println(temp);
}
else {
gotHum = true;
radio.read(&hum, sizeof(flo at));
Serial.print("Humidity: ");
Serial.println(hum);
}
timer1 = millis();
if (gotTemp && gotHum) {
gotTemp = false;
gotHum = false;
payload = getPayload(temp, hum, false);
radio.stopListening();
radio.setDataRate(RF24_1MBPS);
radio.openWritingPipe(wAddress[0]);
delay(25);
radio.write(&payload, 4);
radio.setDataRate(RF24_250KBPS);
Serial.flush();
radio.powerDown();
delayWDT(WDTO_1S);
delayWDT(WD TO_500MS);
radio.powerUp();
radio.startListening();
}
}
if (millis() – timer1 > 100 && !tr) {
payload = getPayload(temp, hum, true);
gotTemp = false;
gotHum = false;
radio.stopListening();
radio.setDataRate(RF24_1MBP S);
radio.openWritingPipe(wAddress[0]);
delay(25);
radio.write(&payload, 4);
radio.setDataRate(RF24_250KBPS);
Serial.flush();
radio.powerDown();
delayWDT(WDTO_1S);
delayWDT(WDTO_500MS);
radio.powerUp();
radio.startListening();
tr = false;
}

66
}

int32_t getPayload(float temp, float hum, boolean lostPacket) {
if (lostPacket) {
if (gotTemp) {
temp = temp * 100;
hum = 2;
} else {
temp = 2;
hum = hum * 100;
}
} else {
temp = temp * 100;
hum = hum * 100;
}
int16_t T = (int16_t) temp;
int16_t H = (int16_t) hum;
int32_t payload = T;
payload = (payload << 16) + H;
return payload;
}

void delayWDT(byte timer) {
sleep_enable();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
ADCSRA &= ~(1 << ADEN);
WDTCSR |= 0b00011000;
WDTCSR = 0b01000000 | timer;
wdt_reset();
sleep_cpu();
sleep_disable();
ADCSRA |= (1 << ADEN);
}

ISR (WDT_vect) {
wdt_disable();
MCUSR = 0;
} Nod D

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include "printf.h"

const int pinCE = 9;

67
const int pinCSN = 10;
int32_t payload;
float temp;
float hum;
unsigned long time1, time2;
RF24 wirelessSPI(pinCE, pinCSN);
const uint64_t rAddress[] = {0xAB3128E3C1LL, 0xAB3128E3C2LL};

void setup()
{
Serial.begin(9600);
printf_begin();
wirelessSPI.begin(); /
wirelessSPI.setDataRate(RF24_1MBPS);
wirelessSPI.setChannel(105); // 2.508ghz
wirelessSPI.setPALevel(RF24 _PA_LOW);
wirelessSPI.enableDynamicAck();
wirelessSPI.openReadingPipe(1, rAddress[0]);
wirelessSPI.openReadingPipe(2, rAddress[1]);
wirelessSPI.startListening();
}

void loop()
{
uint8_t pipeNum;
while (wirelessSPI.avail able(&pipeNum)) {
wirelessSPI.read(&payload, sizeof(payload));
if (pipeNum == 1) {
time1 = millis();
Serial.print("Received from R1: ");
Serial.print("Temperature: ");
temp = getTemp(payload);
Serial.print(temp);
Serial.print(" Humidity: ");
hum = getHum(payload);
Serial.println(hum);
}
else {
time2 = millis();
time2 = time2 – time1;
Serial.print("Time between R1 and R2: ");
Serial.print(time2);
Serial.println(" milliseconds");
Serial.print("Received from R2: ");
Serial.print("Temperature: ");
temp = getTemp(payload);

68
Serial.print(temp);
Serial.print(" Humidity: ");
hum = getHum(payload);
Serial.pr intln(hum);
}
}
}

float getTemp (int32_t payload1) {
payload1 = (payload1 >> 16);
float temp = payload1 / 100.0;
return temp;
}

float getHum (int32_t payload2) {
payload2 = payload2 & 0xFFFF;
float temp = payload2 / 100.0;
return temp;
}

Similar Posts