Sunteți pe pagina 1din 39

Universitatea ”Ștefan cel Mare” din Suceava

Facultatea de Inginerie Electrică și Știința Calculatoarelor

LoRaWAN

Student: Îndrumător

Chiraș Ovidiu-Marius s.l. dr. ing. Potorac Alin-Dan

Specializare: RCC
Cuprins

Cuprins........................................................................................................................................................1
1. LoRa.....................................................................................................................................................2
1.1. Descriere generala.......................................................................................................................2
1.1.1. Node....................................................................................................................................2
1.1.2. Gateway...............................................................................................................................3
1.1.3. Baza de date........................................................................................................................3
1.1.4. Harta WEB............................................................................................................................3
1.2. Descriere hardware.....................................................................................................................4
1.2.1. RFM96..................................................................................................................................4
1.2.2. Microcontrolerul ATmega328p............................................................................................6
1.2.3. Modul de încărcare TP4056.................................................................................................8
1.2.4. Panou fotovoltaic Conrad YH-57X65....................................................................................9
1.2.5. Senzor BME680....................................................................................................................9
1.2.6. Raspbery PI3 B+.................................................................................................................10
1.2.7. iC880A................................................................................................................................11
1.2.8. Acumulator Li-Po...............................................................................................................12
1.3. Descriere software NOD............................................................................................................12
1.4. Descriere software Gateway......................................................................................................16
1.5. Descriere software pagină WEB.................................................................................................19
2. Implementare hardware și software cu rezultate experimentale......................................................22
2.1. Prezentarea sistemului realizat..................................................................................................22
2.2. Modulul de alimentare..............................................................................................................25
Bibliografie................................................................................................................................................26
Premii și participări la competiții studențești............................................................................................27
Anexe.........................................................................................................................................................28
Anexa 1 - Arduino IDE............................................................................................................................28
Anexa 2 - Node JS..................................................................................................................................32
Anexa 3 - HTML index.php.....................................................................................................................34
Anexa 4 - HTML background.php...........................................................................................................36
Anexa 5 - PCB Altium Designer..............................................................................................................37

1
1. LoRaWAN
1.1. Descriere generala

1.1.1. Node
Nodul are ca scop colectarea datelor obținute cu ajutorul unui senzor BME680 care
comunică prin interfața I2C, datele culese sunt: temperatura, umiditate, gaz și presiune. Nodul
mai are de asemenea un modul GPS cu ajutorul căruia putem afla locația modulului. Alimentarea
se realizează de la un acumulator Li-Po, cu tensiunea de 3,7V și capacitatea de 1100mAh.
Acumulatorul este încărcat cu ajutorul unui panou fotovoltaic. Toate procesele sunt executate cu
ajutorul unui microcontroler de la Atmel, mai precis ATmega328p. Pentru o autonomie cât mai
mare între transmisii controlerul intră în modul sleep și oprește alimentarea către celelalte
module cu ajutorul unor întrerupătoare realizate cu tranzistoare de tip MOSFET.

1.1.2. Gateway
Gateway-ul formează o legătură între noduri și platforma TTN (The Things Network).
Nodurile realizate folosesc tehnologia LoRa, fiind subansamblu al unui sistem LoRaWAN.
Gateway-ul folosește rețele de transmisie a datelor cu bandă largă, precum Wi-Fi, Ethernet sau
rețele de telefonie mobilă pentru a se putea conecta la platforma TTN.
Toate Gateway-urile din raza de transmisie a unui dispozitiv vor primi mesajul și îl vor
redirecționa către serverul TTN. Rețeaua va deduplica mesajul și va selecta cel mai bun Gateway
pentru a redirecționa orice mesaj în așteptare. Un singur Gateway poate să servească mii de
dispozitive tip senzor sau noduri de senzori.
Gateway-urile sunt routere echipate cu un concentrator LoRa, permițându-i să
recepționeze pachete LoRa. De obicei poți găsi două tipuri de Gateway-uri:
1.unul care rulează pe un firmware minim, făcându-le ieftine și ușor de utilizat.
2.unul care rulează pe un sistem de operare, pentru care software-ul de expediere a
pachetelor este rulat în spate.
Am utilizat un Gateway instalat pe un Raspberry Pi3 B+, care are un sistem de operare
bazat Linux Raspbian, care rulează în spate transmiterea pachetelor LoRa și are un script pentru
trasmiterea informației de pe platforma TTN la o bază de date.

2
1.1.3. Baza de date
Baza de date are rolul de stocare a datelor din platforma TTN. Toate datele care sunt
transmise de noduri către Gateway sunt stocate într-un server TTN, urmat de copierea lor în baza
de date locală, pentru o manevrare mai ușoară și pentru stocare pe termen mult mai îndelungat.
Serverul TTN permite stocarea datelor pe o perioadă de maxim o saptămâna. Datele sunt
împărțite pe câmpuri într-un tabel.

1.1.4. Harta WEB


Are rolul de a prezenta informațiile adunate într-un mod mai prietenos. Cu ajutorul unui
API de la Google, afișează o hartă centrată asupra orașului Suceava, deoarece majoritatea
nodurilor sunt amplasate în această zona, după care interoghează baza de date pentru a pune câte
o etichetă la fiecare poziție distinctă la care se află câte un nod. Nodul odată afișat preia
informații despre temperatură, umiditate, calitatea aerului și presiune, informații care vor fi
afișate într-un chenar când este selectată eticheta. Astfel, putem vedea mult mai ușor informații
în funcție de fiecare dispozitiv. Acest proces este unul foarte rapid, aproape instant.

1.2. Descriere hardware

1.2.1. RFM96
Modulul RFM95/96 are rolul de trasmițător, este dotat cu un modem LoRa TM care oferă
comunicație cu spectru larg și rază lungă de acțiune cu imunitate ridicată la interferențe,
reducând în același timp consumul de curent. Folosind tehnica de modulare patentată LoRa TM
Hope RF, RFM95/96/98(W) poate atinge o sensibilitate de peste -148dBm folosind un cristal și o
listă de componente cu costuri reduse. Sensibilitatea ridicată, combinată cu amplificatorul de
putere integrat de +20 dBm îl face optim pentru orice aplicație care necesită consum mic sau
transmisie pe distanțe mari.
LoRaTM oferă de asemenea avantaje semnificative atât în ceea ce privește blocarea, cât și
selectivitatea față de tehnicile de modulare convenționale, rezolvând compromisul tradițional de
proiectare între gamă, imunitatea la interferențe și consumul de energie.
Aceste dispozitive suportă, de asemenea, moduri de funcționare FSK (Frequency Shift-
Keying) de înaltă performanță pentru sisteme, inclusiv WMBus, IEEE802.15.4g.

3
RFM95 / 96/97/98 (W) oferă selectivitatea, liniaritatea receptorului și un consum de
curent semnificativ mai mic decât dispozitivele concurente.
RFM97 oferă opțiuni de lățime de bandă variind de la 7,8 kHz la 500 kHz, cu factori de
împrăștiere cuprinse între 6 și 12 și care acoperă toate benzile de frecvență disponibile.

Tabelul 2- 1 Variante de module și parametrii acestora


Model Frecvența Factor de Bandă Viteză Sensibilitate
împrăstier
e
RFM95W 868/915MHz 6-12 7,8-500kHz .018-37,5kbps -111 la -148 dBm
RFM97W 868/915MHz 6-9 7,8-500kHz 0.11-37,5kbps -111 la -148 dBm
RFM96W/ 433/470MHz 6-12 7,8-500kHz .018-37,5kbps -111 la -148 dBm
RFM98W

Figura 2- 1 Configurația pinilor modulului RFM96W [8]

Figura 2- 2 Structura internă a modulului

4
Tabelul 2- 2 Consumul de curent în funcție de modul intern de configurare

Simbol Descriere Max Unit


IDDSL Consum curent modul sleep 1 uA
IDDR Consumul de curent în modul recepție 12,1 mA
IDDT Consumul de curent în modul transmisie cu adaptare 120 mA
de impedanță

Figura 2- 3 Canalele de comunicație LoRaWAN măsurate în camera semi-anecoică

După cum putem observa în figura 2-3, LoRa este capabilă să transmită pe mai multe
canale, cea ce îi oferă garanția că pachetele ajung la Gateway. Canalele pot fi alese în programul
software care este încărcat în controler.

1.2.2. Microcontrolerul ATmega328p

Figura 2- 4 Capsula TQFP32 a microcontrolerului ATmega328P

Caracteristici:
 Microcontroler AVR cu 8 biți de înaltă performanță, cu consum redus

5
 Arhitectură avansată RISC
o 131 de instrucțiuni puternice - cea mai mare execuție a unui singur ciclu de
ceas
o 32 x 8 registre de lucru cu scop general
o Operații complete statice
o De la 16MIPS până la 16MHz
o Multiplicator pe ciclu cu 2 cicluri
 Caracteristici periferice
o Două timere / contoare cu 8 biți, cu prescaler separat și modul de comparare
o Un timer / contor de 16 biți cu prescaler separat, modul de comparare și
captura
o Șase canale PWM
o Contor de timp real cu oscilator separat
o ADC pe 10 biți în pachetul TQFP și QFN / MLF
 Măsurarea temperaturii
o Programare USART serial
o Interfață serială SPI master/slave
o Întreruperea și trezirea la schimbarea pinului
 Intrări/Ieșiri și pachete
o 23 linii I/O programabile
o TQFP cu 32 de pini și QFN/MLF cu 32 Through-Hole pini
 Tensiune de operare
o 2,7V pana la 5,5V pentru ATmega328P
 Interval de temperatura
o Temperatura de funcționare -40°C până la +125 °C
 Frecvența de lucru
o 0 → 8MHz alimentat 2,7 până la 5,5V
o 0 → 16MHz alimentat 4,5V până la 5,5V
 Consum mic

6
o Mod activ 1,5mA alimentat 3V – 4MHz
o Mod dezactivat : 1μA alimentat 3V
Microcontroler AVR pe 8 biți cu 32K Bytes memorie interna.
Pentru a obține consumul real am folosit o placă Arduino Nano care are ca
microcontroler ATmega328p, pe care am modificat-o pentru a obține un consum cât mai mic,
după cum se observă și în tabelul 2-4.

Tabelul 2- 3 Curentul consumat de microcontroler

ATmega328P PWR Source State 5,0 V @ 16 MHz 3,3 V @ 8 MHz


Nemodificat RAW Pin ACT 19,9 mA 4,74 
Nemodificat RAW Pin PDS 3,14 mA 0,90 
Fără LED alimentare RAW Pin ACT 16,9 mA 3,90 
Fără LED alimentare RAW Pin PDS 0,0232 mA 0,0541 
Fără LED, stabilizator VCC Pin ACT 12,7 mA 3,58 
alimentare
Fără LED, stabilizator VCC Pin PDS 0,0058 mA 0,0045 mA
alimentare

Se poate observa că controlerul alimentat la 3,3V consumă mai puțin dar ca efect
funcționează la o frecvență mai mică. Acest lucru nu ne afectează prea mult deoarece controlerul
nu are foarte multe procese de realizat.

1.2.3. Modul de încărcare TP4056


TP4056 este un încărcător complet liniar cu curent constant ideal pentru baterii Li-Ion
sau Li-Po cu o singură celulă. Capsula SOP și numărul redus de compomente necesar
funcționării face ca TP4056 să se potrivească perfect aplicațiilor portabile.
Datorită P-MOSFET-ului intern, nu necesită o diodă de blocare a curentului negativ de
încărcare.
Feedback-ul termic reglează curentul de încărcare pentru a limita temperatura plăcii în
timpul funcținării sau dacă temperatura ambientală este ridicată.
Tensiunea de încărcare este fixă, 4,2V, iar curentul de încărcare poate fi programat
extern cu o rezistență. Ciclul de încărcare se termină când curentul de încărcare scade la 1/10
din valoarea programată până la atingerea tensiunii nominale de încărcare.

7
Alte caracteristici pentru TP4056 sunt, monitorizarea curentului, UVLO, reîncărcare
automată și doi pini pentru a indica starea încărcării și dacă bateria este încărcată complet.
Caracteristici:
 Curent de încărcare programabil până la 1000 mA
 Tensiune de încărcare presetată la 4,2V cu o precizie de 1,5%
 Încarcă bateriile Li-Ion cu o singură celulă direct de la portul USB
 Reîncărcare automată
 Limitator pentru Soft-Start

Figura 2- 5 Capsula SOP-8 a circuitului TP4056

1.2.4. Panou fotovoltaic Conrad YH-57X65

Figura 2- 6 Panou fotovoltaic YH-57X65

Aceste mini-celule solare policristaline de 5,0V/81mA de la Conrad sunt ideale pentru


experimente, precum și pentru furnizarea unei surse de alimentare independente de rețea pentru
consumatori mici sau pentru încărcarea bateriilor. Pentru a atinge tensiunea și curentul dorit,
panourile pot fi legate individual, în paralel sau serie, pur și simplu prin lipirea corespunzătoare a
padurilor disponibile pe partea din spate.

Caracteristici:

8
 Dimensiuni 65x57mm
 Curent nominal 81mA
 Tensiune nominala 5,0V

1.2.5. Senzor BME680


BME680 este un sensor digital 4-in-1 de temperatură, umiditate, presiune și gaz, cu un
consum foarte redus. Senzorului este găzduit într-un pachet LGA extrem de compact, cu o
dimensiune de doar 3x3 mm și cu o înălțime de doar 1mm. Dimensiunile mici și consumul redus
de energie permite integrarea în dispositive cu acumulatori sau aplicații care necesită un consum
foarte mic.

Figura 2- 7 Senzorul BME680

Tabelul 2- 4 Specificațiile electrice ale senzorului BME680


Parametri Min Tipic Max Unitate
Tensiune de alimentare 1,2 1,6 3,6 V
Consumul în modul Sleep 0,15 1 uA
Consumul în modul de așteptare 0,29 0,8 uA
Consumul în timpul masurării umidității 340 450 uA
Consumul în timpul masurării presiunii 714 89 uA
Consumul în timpul masurării temperaturii 350 uA
Timpul de trezire 2 ms

După cum putem observa în tabelul 2-5 putem activa și dezactiva independent senzorii de
temperatură, umiditate și presiune.

1.2.6. Raspbery PI3 B+


Raspberry PI 3 B+ este ca un mic PC All-in-One având un processor quad-core de
1,4GHz, o memorie RAM internă de 1GB LPDDR2 SDRAM, un modul dual-band 2,4GHz și
9
5GHz wireless, 4 porturi USB, alimentat la 5V cu ajutorul unui conector MicroUSB și cu un
consum de maxim 2,5A. Fiind o placă de dezvoltare are 40 de pini I/O care pot fi comandați
destul de ușor dacă ești familiarizat cu sistemul de operare Linux.

Figura 2- 8 Placa de dezvoltare Raspberry Pi 3B+

Am ales această placă de dezvoltare din simplul motiv că are interfață SPI și este ușor de
interfațat cu concentratorul LoRa iC880A.

1.2.7. iC880A
WiMOD iC880A este o placă de dezvoltare LoRaTM care are la bază concentratorul
iC880A folosit într-o varietate de aplicații IoT (Internet of Things), Smart Metering și M2M
(Machine-to-Machine).

10
Figura 2- 9 Placa de dezvoltare a concentratorului iC880A

Este un trasmițător/receptor multi-canal de înaltă performanță conceput pentru a putea


primi mai multe pachete LoRa simultan utilizând diferiți factori de împrăștiere pe mai multe
canale.
Modulul concentrator iC880A este integrat într-un Gateway. Acesta oferă posibilitatea de
a permite o comunicație robustă între un Gateway LoRa și un număr imens de noduri LoRa care
sunt dispuse la distanțe destul de mari față de Gateway. iC880A are nevoie de un sistem gazdă
pentru a funcționa corect. Acest sistem gazdă poate fi un PC sau un MCU la care va fi conectat
iC880A prin USB sau SPI.
În figura 2-9 putem observa Gateway-ul care are interfață de comunicație pe SPI,
componenetele necesare interfeței pe USB nefiind plasate.

1.2.8. Acumulator Li-Po


Pentru a putea alimenta întregul modul am folosit un acumulator Li-Po, format dintr-o
singură celulă de 3,7V și 1100mAh, cu o dimensiune de doar 32x55mm. Acesta se poate integra
cu usurință în orice aplicație care necesită o baterie, sau mai multe de dimensiuni mici.
Caracteristici:
 Dimensiune 6,2x32x55mm
 Tip Li-Po
 Capacitate 1100mA
 Tensiune 3,7V

11
 Curent nominal de descărcare 550mAh
 Curent maxim de descărcare 1100mAh

1.3. Descriere software NOD


Orice nod pentru a putea trimite date către platforma TTN trebuie înregistrat într-o
aplicație. Crearea unei noi aplicații în TTN este destul de simplă. În figura 2-10 putem să
observăm că trebuie să completăm doar câmpul Application ID.

Figura 2- 10 Fereastra de înregistrare a aplicației în TTN

Odată aplicația creată urmează înregistrarea dispozitivului, acest proces este la fel de
simplu. Trebuie să completăm doar câmpul Device ID ca în figura 2-11. Device EUI are opțiunea
de auto generare.

12
Figura 2- 11 Fereastra de înregistrare a nodului în TTN

O aplicație poate avea un număr nelimitat de noduri înregistrate, acest aspect se observă
în figura 2-12. Tot ce trebuie să aibă în comun este decodarea și interpretarea pachetelor. Acest
lucru se realizează în Payload Formats, conform figurii 2-13, unde avem codul pentru decodarea
informației. În figura 2-14 se poate observa formatul datelor decodate.

Figura 2- 12 Lista nodurilor înregistrate în platforma TTN

13
Figura 2- 13 Formatul pachetului de date

Figura 2- 14 Decodificarea datelor din pachet

După ce toate nodurile sunt înregistrate urmează să modificăm codul sursă care trebuie
încărcat pe microcontrolerul nodurilor. Vom utiliza și modifica un exemplu oferit de biblioteca
Arduino-LMIC.
Pentru ca nodul să se conecteze la server-ul TTN, vom folosi din figura 2-15 Device ID,
Network Session Key și App Sesion Key ca în figura 2-16.

14
Figura 2- 15 Elemente cheie pentru configurarea nodului LoRa

Figura 2- 16 Configurarea nodului în interfața de programare Arduino IDE

Următorul pas este integrarea bibliotecilor pentru modul POWER DOWN a


microcontrolerului, senzorului BME680, după cum putem observa în figura 2-17.

Figura 2- 17 Bibliotecile utilizate în programarea nodului din mediul Arduino IDE

În continuare vom citi datele de la senzor, cât și datele de la GPS, după care vom codifica
acele datele pentru a le trimite către server. Spre final, punem microcontrolerul în modul
POWER DOWN pentru a economisi cât mai multă energie cu putință. Microcontrolerul rămâne
în modul POWER DOWN timp de 30 de minute. Toate acestea le putem observa în figura 2-18.

15
Figura 2- 18 Conversia datelor de transmis și utilizarea modului POWER DOWN

1.4. Descriere software Gateway


Gateway-ul folosește modulul iC880A, care este de fapt un concentrator LoRa. Acesta
este conectat la o placă de dezvoltare Raspberry PI folosind comunicația SPI. În cazul în care se
dorește configurarea Gateway-ului va fi nevoie ca pe placa de dezvoltare să fie instalată orice
versiune de Linux.
Pentru configurarea Gateway-ului, se folosesc comenzile următoare :
$ sudo adduser ttn urmată de comanda $ sudo adduser ttn sudo pentru a adăuga un
utilizator nou în categoria de administratori ai sistemului de operare.
Odată adăugat utilizatorul nou, se descarcă pachetul de instalare iC880A cu ajutorul
comenzii:
$ git clone -b spi https://github.com/ttn-zh/ic880a-gateway.git ~/ic880a-gateway
Se navighează în folderul unde s-a descărcat pachetul de instalare :
$ cd ~/ic880a-gateway
Următorul pas este instalarea pachetului descărcat, cu ajutorul comenzii:
$ sudo ./install.sh spi
În timpul instalări este posibilitatea de a alege între a crea un nou fișier de configurare sau
configurare la distanță folosind fișiere de configurare stocate într-un server extern.

16
Folosind configurarea la distanță am întâmpinat problema că nu exista un fișier
compatibil cu MAC-ul Gateway-ului, prin urmare a trebuie să descarc un fișier de configurare și
să-l modific conform pachetului instalat.
Fișierul de configurare descărcat arată ca în figura 2-19. Ce ne interesează să modificăm
este gateway_ID și opțional poziția GPS a acestuia. ID-ul Gateway-ului este cel returnat la
finalul instalării. După ce terminăm de modificat fișierul, îl salvăm locat și reluăm procesul de
instalare. La finalizarea instalării va returna un MAC modificat care este necesar pentru a putea
înregistra Gateway-ul pe serverul TTN.

Figura 2- 19 Fișier de configurare a Gateway-ului

Dupa cum putem observa în figura 2-20, odată completat corect gateway EUI putem
continua procesul de instalare.

17
Figura 2- 20 Fereastra pentru înregistrarea Gateway-ului

Odată instalat Gateway-ul și înregistrat pe serverul TTN, putem să verificăm starea lui ca
în figura 2-21. Dacă conexiunea cu rețeaua de Internet sau setările la configurare nu sunt alese
corespunzător, mesajul afișat în interfața de pe TTN va fi not connected.

Figura 2- 21 Lista de Gateway-uri configurate în platforma TTN

Serverul TTN oferă posibilitatea de a vizualiza toate pachetele de la fiecare nod care se
conectează, dar din motive de securitate nu oferă posibilitatea de a interpreta pachetele, doar
informațiile din figura 2-22. Printre informațiile care se pot observa sunt: timpul transmiterii
pachetului de date, frecvența canalului de comunicație, modulația utilizată (poate fi modulație
LoRa sau FSK), modul de codare a pachetului de date, rata de transfer și factorul de împrăștiere
folosit de către nod, timpul necesar trimiterii pachetului, un contor pentru a vedea câte pachete
au fost trimise de la inițierea comunicației, adresa dispozitivului care trimite datele la server-ul
TTN și dimensiunea pachetului de date. Timpul de transmisie este influențat de lungimea

18
pachetului de date și de factorul de împrăștiere folosit. Cu cât parametrii menționați sunt mai
mari, cu atât va crește și timpul de transmisie a pachetului de date. De asemenea, acest aspect
influențează direct și consumul de energie a nodului (aspectul acesta se poate vedea în secțiunea
următoare, figura 3-3).

Figura 2- 22 Pachetele de date recepționate de către Gateway

1.5. Descriere software pagină WEB


Având în vedere numărul mare de noduri instalate, un mod interactiv de a afișa datele de
la fiecare nod este cu ajutorul unor etichete pe o hartă de la Google Maps. Google oferă
publicului posibilitatea de a folosi API-uri (Application Programming Interface) care permit
apelarea serviciilor în mod gratuit.
Fiecare etichetă va fi generată în funcție de poziția GPS care este salvată în baza de date,
acest proces este realizat cu ajutorul a două fișiere tip php, unul care este index.php, ce se ocupă
cu apelarea API-ului de la google pentru hartă, iar al doilea fiind background.php, care se ocupă
cu apelarea bazei de date și conversia datelor într-un fișier XML. Acesta din urmă va fi preluat

19
de index.php și va crea etichete pe hartă cu toate informațiile disponibile, așa cum se poate vedea
și în figura 2-23.

Figura 2- 23 Eticheta nodului în Google Maps

Pagina se actualizează în mod automat odată la câteva secunde, precum și informația din
interiorul etichetei oferind utilizatorilor ultimele informații disponibile în baza de date.

Figura 2- 24 Funcția pentru prelucrarea datelor din XML

Funcția din figura 2-24 preia datele din fișierul XML și le afișează in interiorul etichetei.
De asemenea afișează și numele etichetei.

20
Figura 2- 25 Funcția de creare a etichetelor

Figura 2- 26 Date din fișierul XML

În figura 2-25 putem observa funcția care creează etichetele pe harta de la Google cu
ajutorul datelor din XML formatate ca în figura 2-26.

21
2. Implementare hardware și software cu rezultate
experimentale
2.1. Prezentarea sistemului realizat
Pe parcursul dezvoltării nodului LoRa, au fost realizate 2 versiuni. Prima versiune nu
îndeplinea în totalitate cea ce mi-am propus sa fac. În figura 3-1 avem PCB-ul și prezentarea
primei versiuni, iar în figura 3-2 avem prezentat versiunea V2.
Prima versiune era alimentată de la un panou solar și un super condensator. Super
condensatorul înmagazinează energie pe parcusul zilei, doar cât timp panoul solar nu furnizează
tensiune electrică pentru a putea incarcă super condensatorul datorită condițiilor meteo
nefavorabile (ploaie, furtună, zăpadă, cer înnorat).
Super condensatorul având o capacitate de 4F și o tensiune de 5V, nu putea înmagazina
indeajuns curent pentru a alimentata pe parcusul nopții nodul. Acesta însă are avantajul încărcării
foarte rapide.

Figura 3- 27 Prototipul PCB-ului v1.0 pentru nodul LoRa

22
Figura 3- 28 Prototipul PCB-ului v2.0 pentru nodul LoRa

A doua versiune are următoarele îmbunătățiri:


- adăugarea modulului GPS pentru citirea coordonatelor nodului
- controlul tensiunii de alimentare a modulului GPS
- controlul tensiunii de alimentare a senzorului
- controlul tensiunii de alimentare a modulului LoRaTM
- un acumulator de 3,7v și 1100mAh pentru o autonomie crescută
- randamentul bateriei crescut
Nodul îndeplinește toate cerințele propuse în proiect. Reușește să se încarce îndeajuns pe
parcursul zile chiar și pe timp de iarnă și să transmită pe toată durata nopții, datorită consumului
mic și a faptului că modulele sunt alimentate doar când microcontrolerul iese din modul POWER
DOWN.
Datele din figura 3-3 au fost preluate folosind un senzor de curent MAX471 alimentat
extern pentru a nu influența citirea curentului consumat. Valorile prezentate relevă consumul
nodului în modul transmisie-recepție pentru diferiți factori de împrăștiere aleși. Acest lucru

23
influențează și valoare consumului de curent pe durata comunicației, fiind un aspect important
când vrem să folosim o sursă de alimentare cu capacitate mică.

120
120
100 SF8
100 SF7

Measured current [mA]


Measured current [mA]

80
80
Transmitting time = 103ms @ 117.18mA
60
Transmitting time = 68ms @ 117.18mA 60

40 40
Radio listen time = 11.87s @ 4.88mA Radio listen time = 11.94s @ 4.88mA
20 20

0 0
Time [s] Time [s]

120
120

SF9 100 SF10


100
Measured current [mA]
Measured current [mA]

80 80

Transmitting time = 210ms @ 117.18mA Transmitting time = 375ms @ 107.42mA


60 60

40 40
Radio listen time = 20.4s @ 4.88mA Radio listen time = 36.9s @ 4.88mA
20 20

0 0
Time [s] Time [s]

120 120

100 SF11 100 SF12


Measured current [mA]
Measured current [mA]

80 80

Transmitting time = 818ms @ 112.35mA Transmitting time = 1.5s @ 112.35mA


60 60

40 40
Radio listen time = 63.13s @ 4.88mA Radio listen time = 109.47s @ 4.88mA
20 20

0 0
Time [s] Time [s]

Figura 3- 29 Măsurarea consumului de curent în funcție de factorul de împrăștiere

24
2.2. Modulul de alimentare

Panou fotovoltaic Circuit de încărcare


5V/81mA TP4056

Acumulator Li-Po
Nod LoRa
3,7V/1100mA

Figura 3- 30 Schema bloc a circuitului de alimentare

În figura 3-4 avem prezentat modul de alimentare a nodului. Nodul are tensiunea
nominală de 3,3V. Panoul fotovoltaic furnizează o tensiune de maxim 5V, în funcție de
intensitatea luminoasă, circuitul de încărcare stabilizează tensiunea la 4,2V necesar pentru a
încărca corect acumulatorul. De asemenea circuitul integrat TP4056 are un rezistor de
programare cu valoarea de 1,2kΩ care setează curentul maxim de încărcare. Această opțiune este
din cauză că mulți acumulatori nu suportă un curent mare de încărcare.
Microcontrolerul suportă o tensiune de alimentare care poate varia între 3,3V și 5,5V.
Acumulatorul în funcție de cât este încărcat, are o tensiune la ieșire care poate varia între 2,7V și
4,2V. Din acest motiv, microcontrolerul nu necesită un stabilizator și este conectat direct la
acumulator. Prin această modalitate nu apar căderi de tensiune pe stabilizatori și consumul este
mult mai mic.
Restul modulelor cum ar fi GPS-ul, senzorul BME680 și modulul LoRa sunt alimentate
printr-un întrerupător realizat cu tranzistoare MOSFET. Am ales această modalitate de comandă
deoarece tranzitorii MOSFET au o rezistență internă foarte mică (RDS-ON), rezultând un consum
mult mai redus de putere decât în cazul folosirii tranzistorilor bipolari.
În timpul testării consumului, am observat că tensiunea acumulatorului poate sa scadă
sub 2,8V. Acest nivel este unul critic pentru acumulatorul în tehnologie Li-Po. Sub acest nivel
acumulatorul poate ajunge în stadiul în care nu mai poate fi reîncărcat. Drept urmare, am adăugat
în programul software o funcție care menține controlerul în modul POWER DOWN atât timp cât
nivelul acumulatorului este sub 3,2V. Dacă tensiunea acumulatorului ajunge la 3,2V, nodul nu

25
mai consumă curent și așteaptă până când acest nivel va crește. Acest lucru crește durata de viață
a acumulatorului cu peste 60%.

Bibliografie
1. WiMOD_IC880A
https://webshop.ideetron.nl/Files/3/1000/1211/Attachments/Product/IB4c6A1J5Uh6Ej5D
3i6cQ88q1P2D1404.pdf
2. F. POPESCU, I. IONEL, N. LONTIS, L. CALIN, I.L. DUNGAN, “AIR QUALITY
MONITORING în AN URBAN AGGLOMERATION”, Rom. Journ. Phys., Vol. 56,
Nos. 3–4, P. 495–506, Bucharest, 2011;
3. SamiKaivonen, EdithNgai, “Real-time air pollution monitoring with sensors on city bus”,
Digital Communications and Networks Journal, 2019;
4. Foaie de catalog a senzorului BME680,
https://cdn-shop.adafruit.com/product-files/3660/BME680.pdf
5. Foaie de catalog a circuitului integrat TP4056A
https://dlnmh9ip6v2uc.cloudfront.net/datasheets/Prototyping/TP4056.pdf
6. Foaie de catalog a plăcii de dezvoltare Raspberry PI 3 B+
https://static.raspberrypi.org/files/product-briefs/Raspberry-Pi-Model-Bplus-Product-
Brief.pdf
7. Foaie de catalog a microcontrolerului ATmega 328p
http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-
Microcontrollers-ATmega328P_Datasheet.pdf
8. Foaie de catalog a modulului RFM96W
https://cdn.sparkfun.com/assets/learn_tutorials/8/0/4/RFM95_96_97_98W.pdf
9. TheThingsNetwork
https://www.thethingsnetwork.org/labs/

26
Premii și participări la competiții studențești

Premii:
1. Locul I – TIE, Galați, 2019
2. Locul III – TIE, Suceava, 2018 Etapa locală
3. Locul III - Hard & Soft Ediția 26, Suceava, 19-26 Mai 2019
4. Locul III - Hard & Soft Ediția 24, Suceava, Mai 2017
5. Premiu special – StudAce, Suceava, 5 Iunie 2019
6. Premiu special – StudAce, Suceava, 5 Iunie 2019

Participări:
1. Participare – Robotics Championship, Oradea, 2018
2. Participare – RoboManiacs, Oradea, 2018
3. Participare – RoboTEC, Timișoara, 2018

27
Anexe
Anexa 1 - Arduino IDE
#include <lmic.h>
#include <hal/hal.h>
#include <SPI.h>
#include <Wire.h>
#include <avr/sleep.h>
#include "SparkFunHTU21D.h"
#include "LowPower.h"

int16_t temperature = 0;
int16_t humidity = 0;
int i = 0;
static const PROGMEM u1_t NWKSKEY[16] = { 0xE4, 0xAA, 0xFA, 0x97, 0x8E, 0xDB, 0xC0, 0x42, 0x4C,
0x41, 0x3C, 0x9A, 0x6C, 0x6D, 0x78, 0x8E };
static const u1_t PROGMEM APPSKEY[16] = { 0x23, 0x2B, 0xD6, 0x50, 0x77, 0x01, 0xC4, 0xA1, 0xEB,
0x6B, 0x3A, 0xA8, 0x09, 0xF8, 0x38, 0xDC };
static const u4_t DEVADDR = 0x26011ECB;
HTU21D myHumidity;

int RawValue= 0;
float Current = 0;

void os_getArtEui (u1_t* buf) { }


void os_getDevEui (u1_t* buf) { }
void os_getDevKey (u1_t* buf) { }

static uint8_t mydata[] = "abcdefghij";


static osjob_t initjob, sendjob, blinkjob;

// Schedule TX every this many seconds (might become longer due to duty
// cycle limitations).
const unsigned TX_INTERVAL = 10;

// Pin mapping
const lmic_pinmap lmic_pins = {
.nss = 10,
.rxtx = LMIC_UNUSED_PIN,
.rst = 9,
.dio = {2, 6, 7},
};
void do_send(osjob_t* j)
{
// Check if there is not a current TX/RX job running

28
if (LMIC.opmode & OP_TXRXPEND)
{
}
else
{
// Prepare upstream data transmission at the next possible time.
LMIC_setTxData2(1, mydata, sizeof(mydata) - 1, 0);
}
// Next TX is scheduled after TX_COMPLETE event.
}
long readVcc()
{
long result;
float val;
// Read 1.1V reference against AVcc
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Convert
while (bit_is_set(ADCSRA, ADSC));
result = ADCL;
result |= ADCH << 8;
result = 1126400L / result; // Back-calculate AVcc in mV
val = result;
val /= 10.24;
return val;

}
void onEvent (ev_t ev) {
switch (ev) {
case EV_TXCOMPLETE:
if (LMIC.dataLen) {
}
// Schedule next transmission
os_setTimedCallback(&sendjob, os_getTime() + sec2osticks(TX_INTERVAL), do_send);

delay(100);
if ((digitalRead(A4) == HIGH) && (digitalRead(A5) == HIGH))
{
temperature = myHumidity.readTemperature() * 10;
humidity = myHumidity.readHumidity() * 10;
mydata[0] = (temperature >> 8) & 0xFF;
mydata[1] = temperature & 0xFF;
mydata[2] = (readVcc() >> 8) & 0xFF;
mydata[3] = readVcc() & 0xFF;
mydata[4] = (humidity >> 8) & 0xFF;
mydata[5] = humidity & 0xFF;
Wire.end();

29
digitalWrite(3, LOW);
digitalWrite(A1, LOW);
digitalWrite(A4, LOW);
digitalWrite(A5, LOW);
pinMode(3, INPUT);
pinMode(A1, INPUT);
pinMode(A4, INPUT);
pinMode(A5, INPUT);

while (i < 15)


{
LowPower.powerExtStandby(SLEEP_4S, ADC_OFF, BOD_OFF, TIMER2_OFF);
delay(10);
i++;
}
pinMode(3, OUTPUT);
pinMode(A1, OUTPUT);
i = 0;
digitalWrite(A1, HIGH);
digitalWrite(3, HIGH);
Wire.begin();
}
break;
}
}

void setup() {
while (!Serial);
myHumidity.begin();
pinMode(A1, OUTPUT);
pinMode(3, OUTPUT);
digitalWrite(A1, HIGH);
digitalWrite(3, HIGH);
os_init();
LMIC_reset();
#ifdef PROGMEM
uint8_t appskey[sizeof(APPSKEY)];
uint8_t nwkskey[sizeof(NWKSKEY)];
memcpy_P(appskey, APPSKEY, sizeof(APPSKEY));
memcpy_P(nwkskey, NWKSKEY, sizeof(NWKSKEY));
LMIC_setSession (0x1, DEVADDR, nwkskey, appskey);
#else
LMIC_setSession (0x1, DEVADDR, NWKSKEY, APPSKEY);
#endif
LMIC_setupChannel(0, 868100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(1, 868300000, DR_RANGE_MAP(DR_SF12, DR_SF7B), BAND_CENTI); // g-band
LMIC_setupChannel(2, 868500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(3, 867100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band

30
LMIC_setupChannel(4, 867300000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(5, 867500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(6, 867700000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(7, 867900000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(8, 868800000, DR_RANGE_MAP(DR_FSK, DR_FSK), BAND_MILLI); // g2-band
LMIC_setLinkCheckMode(0);
LMIC.dn2Dr = DR_SF9;
LMIC_setDrTxpow(DR_SF7, 14);
do_send(&sendjob);
}

void loop()
{
os_runloop_once();
}

31
Anexa 2 - Node JS
const databaseOptions = {
host: 'apollo.eed.usv.ro',
user: 'chiras_ovidiu',
password: 'ovidiiu10'
};
const TTNOptions = {
appID: 'temperature-umiditate',
accessKey: 'ttn-account-v2.pf4H-_BSvAOLoWJTV3_s1U-CC4NSqTPC4RIFhZfRutk'
};
module.exports = {databaseOptions: databaseOptions, TTNOptions: TTNOptions};

const ttn = require('ttn');


const mysql = require('mysql');
const moment = require('moment');
const config = require('./config.js');
config.databaseOptions.database = "db_chiras_ovidiu";
const appID = config.TTNOptions.appID;
const accessKey = config.TTNOptions.accessKey;

const con = mysql.createConnection(config.databaseOptions);

con.connect(function(err) {
if (err) throw err;
console.log("Connected to database");
});

ttn.data(appID, accessKey)
.then(function (client) {
client.on("uplink", async function (devID, payload) {
console.log("Received uplink from", devID);
if( payload.counter != undefined) {
const hardware_serial = payload.hardware_serial;
const port = payload.port;
const counter = payload.counter;
const payload_raw =payload.payload_raw;
const bytes=payload_raw;
console.log("payload length=",bytes.length);
const temperature = (bytes[0] << 8) | bytes [1];
const battery = (bytes[2] << 8) | bytes [3];
const humidity = (bytes[4] << 8) | bytes [5];
const lg= ((bytes[10] << 8) | bytes [11])*10000+(bytes[12] << 8) | bytes $
const lt = ((bytes[6] << 8) | bytes [7])*10000+(bytes[8] << 8) | bytes [9$
console.log(temperature);
console.log(humidity);
console.log(battery);

32
console.log(lg);
console.log(lt);
const query = "INSERT INTO sensor_data SET ?";
const values = {
hardware_serial: hardware_serial,
varID:devID,
counter: counter,
temperature:parseFloat(temperature/10),
humidity:parseFloat(humidity/10),
battery:parseFloat(battery/100),
lt:parseFloat(lt/1000000),
lg:parseFloat(lg/1000000) };
con.query(query, values, function (err, results) {
if(err) throw err;
console.log("Record inserted: ",results.insertId);
});}}) })
.catch(function (error) {
console.error("Error", error)
process.exit(1) })

33
Anexa 3 - HTML index.php
<!DOCTYPE html>
<html>
<head>
<title>Google Map</title>
<script type="text/javascript" src="js/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?key=AIzaSyBD-
xMxQpq7I6W79-S7GoBscVPiW1ViNjA&libraries=visualization"></script>
<script type="text/javascript">
$(document).ready(function() {
var mapCenter = new google.maps.LatLng(47.64, 26.25); //Google map Coordinates
var map;
map_initialize(); // initialize google map`
function map_initialize()
{var googleMapOptions =
{center: mapCenter, // map center
zoom: 12, //zoom level, 0 = earth view to higher value
maxZoom: 20,
minZoom: 0,
zoomControlOptions: {
style: google.maps.ZoomControlStyle.STANADARD //zoom control size},
scaleControl: true, // enable scale control
mapTypeId: google.maps.MapTypeId.ROADMAP};
map = new google.maps.Map(document.getElementById("google_map"), googleMapOptions);

$.get("background.php", function (data) {


$(data).find("marker").each(function () {
var name = $(this).attr('varID');
var info = '<p>Temp:'+ $(this).attr('temperature') +
'°C</p><p>Humidity:'+$(this).attr('humidity')+
'%</p><p>Battery:'+$(this).attr('battery')+'v</p>';
var type = $(this).attr('type');
var id = $(this).attr('id');
var baterie = $(this).attr('baterie');
var point = new google.maps.LatLng(parseFloat($(this).attr('lt'))
,parseFloat($(this).attr('lg')));
create_marker(point, name, info, false, false, false);});));}
function create_marker(MapPos, MapTitle, MapDesc, InfoOpenDefault, DragAble)
{var marker = new google.maps.Marker({
position: MapPos,
map: map,
draggable:DragAble,
title:MapTitle});
var contentString = $('<div class="marker-info-win">'+
'<div class="marker-inner-win"><span class="info-content">'+
'<h1 class="marker-heading">'+MapTitle+

34
'</h1></span><name="View on Maps" class="remove-marker" title="View on Maps">'
+MapDesc+'</button></div></div>');
var infowindow = new google.maps.InfoWindow();
infowindow.setContent(contentString[0]);
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map,marker); });
if(InfoOpenDefault) //whether info window should be open by default
{ infowindow.open(map,marker);} }});
</script>
<style type="text/css">
h1.heading{padding:0px;margin: 0px 0px 10px 0px;text-align:center;font: 18px Georgia, "Times New
Roman", Times, serif;}
/* width and height of google map */
#google_map {width: 90%; height: 800px;margin-top:auto;margin-left:auto;margin-right:auto;}
/* Marker Edit form */
.marker-edit label{display:block;margin-bottom: 5px;}
.marker-edit label span {width: 100px;float: left;}
.marker-edit label input, .marker-edit label select{height: 24px;}
.marker-edit label textarea{height: 60px;}
.marker-edit label input, .marker-edit label select, .marker-edit label textarea {width:
60%;margin:0px;padding-left: 5px;border: 1px solid #DDD;border-radius: 3px;}
/* Marker Info Window */
h1.marker-heading{color: #585858;margin: 0px;padding: 0px;font: 18px "Trebuchet MS", Arial;border-
bottom: 1px dotted #D8D8D8;}
div.marker-info-win {max-width: 300px;margin-right: 0px;}
div.marker-info-win p{padding: 0px;margin: 10px 0px 10px 0;}
div.marker-inner-win{padding: 20px;}
button.save-marker, button.remove-marker{border: none;background: rgba(0, 0, 0, 0);color:
#00F;padding: 0px;text-decoration: underline;margin-right: 10px;cursor: pointer;
}
</style>
</head>
<body>
<div align="center"></div>
<div id="google_map"></div>
</body>
</html>

35
Anexa 4 - HTML background.php
<?php
$db_username = 'chiras_ovidiu';
$db_password = 'ovidiiu10';
$db_name = 'db_chiras_ovidiu';
$db_host = '80.96.120.23';
//mysqli
$mysqli = new mysqli($db_host, $db_username, $db_password, $db_name);
if (mysqli_connect_errno())
{ header('HTTP/1.1 500 Error: Could not connect to db!');
exit();}
//Create a new DOMDocument object
$dom = new DOMDocument("1.0");
$node = $dom->createElement("markers"); //Create new element node
$parnode = $dom->appendChild($node); //make the node show up
// Select all the rows in the markers table
$results = $mysqli->query("SELECT * FROM sensor_data WHERE 1");
if (!$results) {
header('HTTP/1.1 500 Error: Could not get markers!');
exit();}
//set document header to text/xml
header("Content-type: text/xml");
// Iterate through the rows, adding XML nodes for each
while($obj = $results->fetch_object())
{ $node = $dom->createElement("marker");
s $newnode = $parnode->appendChild($node);
$newnode->setAttribute("varID",$obj->varID);
$newnode->setAttribute("temperature", $obj->temperature);
$newnode->setAttribute("lt", $obj->lt);
$newnode->setAttribute("lg", $obj->lg);
$newnode->setAttribute("battery", $obj->battery);
$newnode->setAttribute("humidity", $obj->humidity); }
echo $dom->saveXML();

36
Anexa 5 - PCB Altium Designer

37
38

S-ar putea să vă placă și