Documente Academic
Documente Profesional
Documente Cultură
LoRaWAN
Student: Îndrumător
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.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.
4
Tabelul 2- 2 Consumul de curent în funcție de modul intern de configurare
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.
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.
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.
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
Caracteristici:
8
Dimensiuni 65x57mm
Curent nominal 81mA
Tensiune nominala 5,0V
După cum putem observa în tabelul 2-5 putem activa și dezactiva independent senzorii de
temperatură, umiditate și presiune.
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
11
Curent nominal de descărcare 550mAh
Curent maxim de descărcare 1100mAh
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.
13
Figura 2- 13 Formatul pachetului de date
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
Î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
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.
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.
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).
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.
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.
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
Î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.
22
Figura 3- 28 Prototipul PCB-ului v2.0 pentru nodul LoRa
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
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
80 80
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
80 80
40 40
Radio listen time = 63.13s @ 4.88mA Radio listen time = 109.47s @ 4.88mA
20 20
0 0
Time [s] Time [s]
24
2.2. Modulul de alimentare
Acumulator Li-Po
Nod LoRa
3,7V/1100mA
Î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;
// 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);
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};
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);
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