Intenção dessa aula
1. Mudança de frequência
2. Demonstrar um programa que
modifica a frequência
3. Protocolo LoRaWan
4. Rádio Lora
Objetivo
Nosso objetivo será criar um projeto no qual teremos
dois
ESP32 Lora
se comunicando, e a cada vez que
pressionarmos um botão que estará ligado ao
EMISSOR
,
ele mudará a freqüência de comunicação, avisando
através do pacote ao
RECEPTOR
para também mudar a
freqüência mantendo assim a comunicação entre eles.
3
//array de frequências válidas que utilizaremos para trocar
Quando eu uso ESP32 Lora ?
Criptografia LoRaWan
https://www.thethingsnetwork.org/wiki/LoRaWAN/Home#lorawan_frequency-bands_china-779-787-mhz-and-470-510-mhz
LoRaWAN conhece
três chaves de segurança distintas
de 128 bits. A chave da aplicação
AppKey
só é
conhecida pelo dispositivo e pelo aplicativo. Quando
um dispositivo se une à rede (isto é chamado de
associação ou ativação), uma chave de sessão de
aplicativo
AppSKey
e uma chave de sessão de rede
NwkSKey
são geradas. O
NwkSKey
é compartilhado
com a rede, enquanto o
AppSKey
é mantido em
privado. Estas chaves de sessão serão usadas durante a
duração da sessão.
A figura ao lado mostra como essas
chaves são usadas. O
AppSKey
é
usado para criptografia de ponta a
ponta da carga útil do quadro. O
algoritmo usado para isso é AES-128,
semelhante ao algoritmo usado no
padrão 802.15.4. O
NwkSKey
conhecido é conhecido pela rede e
pelo dispositivo e é usado para
validar a integridade de cada
mensagem pelo seu Código de
integridade da mensagem (MIC). Este
MIC é semelhante a uma soma de
verificação, exceto que impede a
adulteração intencional de uma
mensagem. Para isso, o LoRaWAN usa
AES-CMAC.
LoRa® - LoRaWAN™ - e as Frequências
Frequências:
Estados Unidos : 902-928 mHz
Austrália : 915-928 mHz
China : 779-787 e 470-510 mHz
Europa : 863-870 e 433 mHz
Brasil : 902-928 mHz
928 mHz 902 mHz 907,5 mHz 915 mHzBrasil
USA
Site: www.teleco.com.brNo Brasil, a administração de frequências está sob a responsabilidade da Anatel. Para o caso brasileiro, a Anatel regulamentou a banda de 900 MHz para operação GSM conforme o esquema acima:
40 canais 7,5 mHz
5,5 mHz 13 mHz
Valido para a data de 15/02/2018 mas pode sofrer alteração conforme resolução da Anatel
A ultima foi Resolução nº 680, de 27 de junho de 2017
Quando eu uso ESP32 Lora ?
1) Precisa de velocidade “tempo de resposta”
2) Não quer pagar mensalidade ou tráfego
3) Não existe cobertura pública de gateways
4) Aplicação específica ex: Controle remoto
5) Sensores exóticos incompatíveis com hardware padrão
Em
www.fernandok.com
Lora Esp32 Oled
Montagem
Bibliotecas
Adicione a seguinte biblioteca “Adafruit SSD1306”.
Programas
Pacote : Sender Receiver
byte 0: índice de frequência
byte 1: # delimitador
byte 2: unsigned int
byte 3: unsigned int
Criaremos 2 programas, um para o ESP32 Lora que
trabalhará como
EMISSOR
e outro programa para o
ESP32 Lora que trabalhará como
RECEPTOR
.
13
//array de frequências válidas que utilizaremos para trocar
Programa EMISSOR
14
O programa EMISSOR ficará configurado para iniciar na
freqüência 915Mhz e ficar enviando pacotes. A cada
vez que o botão ligado a ele for pressionado, a
freqüência mudará e um comando será enviado para o
RECEPTOR mudar também.
Programa EMISSOR Sender
15
#include <SPI.h> #include <LoRa.h> #include <Wire.h> #include "SSD1306.h“ //pino Botão #define PIN_BTN 23 //pino LED #define PIN_LED 22// Pin definetion of WIFI LoRa 32
// HelTec AutoMation 2017 support@heltec.cn
#define SCK 5 // GPIO5 -- SX127x's SCK
#define MISO 19 // GPIO19 -- SX127x's MISO
#define MOSI 27 // GPIO27 -- SX127x's MOSI
#define SS 18 // GPIO18 -- SX127x's CS
#define RST 14 // GPIO14 -- SX127x's RESET
#define DI00 26 // GPIO26 -- SX127x's IRQ(Interrupt Request)
#define PABOOST true
//array de frequencias válidas que utilizaremos para trocar
long
frequencia[6] = {915000000, 915125000, 868000000, 868125000, 433000000, 433125000};
//controla o indice da frequencia atual no array
int
indice =
0
;
unsigned
int
counter =
0
;
//um contador que servirá como dado para envio //armazenam estado do botãoint
estadoBtn, ultimoEstadoBtn;
SSD1306
display
(
0x3c
,
4
,
15
);
Setup
16
void setup() {
pinMode(16,OUTPUT); // display OLED do Lora
pinMode(2,OUTPUT); // Led interno do ESP32 Serial.begin(115200);
pinMode(PIN_BTN, INPUT);
pinMode(PIN_LED, OUTPUT);
digitalWrite(16, LOW); // set GPIO16 low to reset OLED
delay(50);
digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high
display.init();
display.flipScreenVertically(); display.setFont(ArialMT_Plain_10);
delay(1500); display.clear();
SPI.begin(SCK,MISO,MOSI,SS); LoRa.setPins(SS,RST,DI00);
if (!LoRa.begin(frequencia[indice],PABOOST)) {
display.drawString(0, 0, "Starting LoRa failed!"); display.display();
while (1); }
LoRa.enableCrc(); // Por default é desativado
display.drawString(0, 0, "LoRa Initial success!"); display.display();
delay(1000);
//define estado do botao como desligado
estadoBtn = ultimoEstadoBtn = LOW;
digitalWrite(PIN_LED, LOW); }
Loop
17
void loop() {
//recupera o estado do botao
estadoBtn = digitalRead(PIN_BTN);
//verifica se o estado do botão mudou e se mudou para LIGADO
if( (estadoBtn != ultimoEstadoBtn) && (estadoBtn == HIGH) ) {
//liga o LED indicador de mudança de frequencia
digitalWrite(PIN_LED, HIGH);
//verificação para não estourar o indice do array
if( (indice+1) > 5){ indice = 0; } else { indice++; }
enviarPacote(); // avisa que mudou frequência
atualizarDisplay();
mudarFrequencia(); }
//caso nao tenha apertado o botão, ou seja, seu estado é DESLIGADO, então a frequencia permanece a mesma
else {
enviarPacote();
atualizarDisplay(); }
//contador que é enviado (DADO)
counter++;
//copia o estado atual do botão na variável de verificação da mudança de estado
ultimoEstadoBtn = estadoBtn;
//acende LED interno para indicar que enviou o pacote e da um delay
digitalWrite(2, HIGH);
delay(700);
digitalWrite(2, LOW);
delay(500); }
18
//muda a frequencia do Lora, a nova frequencia será de acordo com a variável "INDICE" //que pegará no array a nova frequencia
void
mudarFrequencia
(){
if
(!LoRa.
begin
(frequencia[indice],PABOOST))
{
display.
drawString
(
0
,
0
, "Starting LoRa failed!");
display.
display
();
while
(
1
);
}
LoRa.
enableCrc
();
digitalWrite
(PIN_LED,
LOW
);
//desliga o LED indicador da mudança de frequência}
//envia o pacote na rede Lora
void
enviarPacote
()
{
// envia um pacote
LoRa.
beginPacket
();
LoRa.
(indice);
//indice do array que contem as frequenciasLoRa.
("#");
//delimitador
LoRa.
(counter);
//dado
LoRa.
endPacket
();
}
atualizarDisplay
19
//atualiza as informações no display
void
atualizarDisplay
()
{
display.
clear
();
display.
setTextAlignment
(TEXT_ALIGN_LEFT);
display.
setFont
(ArialMT_Plain_10);
display.
drawString
(
0
,
0
, "Enviando Pacote: ");
display.
drawString
(
90
,
0
,
String
(counter));
display.
drawString
(
0
,
20
,
String
(frequencia[indice]));
display.
drawString
(
90
,
20
, "I: "+
String
(indice));
display.
display
();
}
Programa RECEPTOR
20
O programa RECEPTOR ficará configurado para iniciar
na freqüência
915Mhz
e a cada pacote recebido,
verificará se o comando para mudança de freqüência
está presente para se reconfigurar.
Programa RECEPTOR
21
#include <SPI.h> #include <LoRa.h> #include <Wire.h> #include "SSD1306.h“// Pin definetion of WIFI LoRa 32
// HelTec AutoMation 2017 support@heltec.cn
#define SCK 5 // GPIO5 -- SX127x's SCK
#define MISO 19 // GPIO19 -- SX127x's MISO
#define MOSI 27 // GPIO27 -- SX127x's MOSI
#define SS 18 // GPIO18 -- SX127x's CS
#define RST 14 // GPIO14 -- SX127x's RESET
#define DI00 26 // GPIO26 -- SX127x's IRQ(Interrupt Request)
#define PABOOST true
//array de frequencias válidas que utilizaremos para trocar
long
frequencia[6] = {915000000, 915125000, 868000000, 868125000, 433000000, 433125000};
//controla o indice da frequencia atual no array
int
indice =
0
;
SSD1306
display
(
0x3c
,
4
,
15
);
String
rssi = "RSSI --";
String
packSize = "--";
Setup
22
void setup() {
pinMode(16,OUTPUT);
pinMode(2,OUTPUT);
digitalWrite(16, LOW); // set GPIO16 low to reset OLED
delay(50);
digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high
display.
init
();
display.
flipScreenVertically
();
display.
setFont
(ArialMT_Plain_10);
delay
(
1500
);
display.
clear
();
SPI.
begin
(SCK,MISO,MOSI,SS);
LoRa.
setPins
(SS,RST,DI00);
if
(!LoRa.
begin
(frequencia[indice],PABOOST))
{
display.
drawString
(
0
,
0
,
"Starting LoRa failed!"
);
display.
display
();
while
(
1
);
}
LoRa.
enableCrc
();
display.
drawString
(
0
,
0
,
"LoRa Initial success!"
);
display.
drawString
(
0
,
10
,
"Wait for incomm data..."
);
display.
display
();
delay
(
1000
);
LoRa.
receive
();
Loop e parserPacket
23
void
loop
()
{
int
packetSize = LoRa.
parsePacket
();
//imprime na tela a frequencia atual que está configurada
display.
drawString
(
0
,
45
,"Freq: "+
String
(frequencia[indice]));
display.
display
();
if
(packetSize) {
parserPacket
(packetSize);
}
}
//faz o parser do pacote recebido para tratar os dados
void
parserPacket
(
int
packetSize)
{
packet ="";
packSize =
String
(packetSize,
DEC
); // transforma em decimal
for
(
int
i =
0
; i < packetSize; i++) {
packet += (
char
) LoRa.
read
(); // lê byte a byte
}
rssi = "RSSI " +
String
(LoRa.
packetRssi
(),
DEC
) ; // Valor em dBm
verificaFrequencia
();
loraData
();
}
verificarFrequencia e loraData
24
//verifica se no pacote recebido tem um comando para trocar de frequencia
void
verificaFrequencia
(){
//o primeiro byte do pacote tem o indice da frequencia que o emissor está usando, // colocamos esse valor em CMD para fazeras verificações
String
cmd =
String
(packet.
charAt
(
0
));
//se o indice recebido é diferente do atual, então trocamos a frequencia