LoRaWAN OTAA

Este exemplo apresenta a transmissão LoRaWAN OTAA com o módulo IoT JVTECH. Lembrando de ligar a alimentação do rádio LoRa.

Dependência

-> Lmic

A biblioteca pode ser baixada dentro da própria Arduino IDE, através do gerenciador de bibliotecas.

Exemplo

/*
Autor: João Vitor Alvares
Versão: 1.0
Objetivo: Tranmissão LoRaWAN OTAA com o MIJ (Módulo IoT JVTECH)
Ligar a chave da placa para alimentar o LoRa
*/

#include <lmic.h> // Biblioteca MCCI LoRaWAN LMIC library versão: 2.3.2 por Terry Moore
#include <hal/hal.h> // Biblioteca nativa do ESP32
#include <SPI.h> // Biblioteca nativa do ESP32
// Para ESP32
#include <Arduino.h> // Biblioteca nativa do ESP32

// little-endian 
static const u1_t PROGMEM APPEUI[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI, 8);}
// little-endian 
static const u1_t PROGMEM DEVEUI[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
void os_getDevEui (u1_t* buf) { memcpy_P(buf, DEVEUI, 8);}
// little-endian 
static const u1_t PROGMEM APPKEY[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
void os_getDevKey (u1_t* buf) {  memcpy_P(buf, APPKEY, 16);}

// Dados para enviar
static uint8_t mydata[] = "jvtech-teste01";

// Instância
static osjob_t sendjob;

// Tempo de envio em milisegundos
const unsigned TX_INTERVAL = 60;

// Pin mapping
const lmic_pinmap lmic_pins = {
	
    .nss = 5,
    .rxtx = LMIC_UNUSED_PIN,
    .rst = 14,
    .dio = {26, 13, LMIC_UNUSED_PIN}, // (DIO0, DIO1)
	
};

void onEvent (ev_t ev) {
	
    Serial.print(os_getTime());
    Serial.print(": ");
	
    switch(ev) {
        case EV_SCAN_TIMEOUT:
            Serial.println(F("EV_SCAN_TIMEOUT"));
            break;
        case EV_BEACON_FOUND:
            Serial.println(F("EV_BEACON_FOUND"));
            break;
        case EV_BEACON_MISSED:
            Serial.println(F("EV_BEACON_MISSED"));
            break;
        case EV_BEACON_TRACKED:
            Serial.println(F("EV_BEACON_TRACKED"));
            break;
        case EV_JOINING:
            Serial.println(F("EV_JOINING"));
            break;
        case EV_JOINED:
            Serial.println(F("EV_JOINED"));
            {
				
				u4_t netid = 0;
				devaddr_t devaddr = 0;
				u1_t nwkKey[16];
				u1_t artKey[16];
				LMIC_getSessionKeys(&netid, &devaddr, nwkKey, artKey);
				Serial.print("netid: ");
				Serial.println(netid, DEC);
				Serial.print("devaddr: ");
				Serial.println(devaddr, HEX);
				Serial.print("artKey: ");
				
				for (int i=0; i<sizeof(artKey); ++i) {
					
					Serial.print(artKey[i], HEX);
					
				}
				
				Serial.println("");
				Serial.print("nwkKey: ");
				
				for (int i=0; i<sizeof(nwkKey); ++i) {
					
					Serial.print(nwkKey[i], HEX);
					
				}
				
				Serial.println("");
            
			}			
            LMIC_setLinkCheckMode(0); // Desabilita a verificação de validação
            break;
        case EV_JOIN_FAILED:
            Serial.println(F("EV_JOIN_FAILED"));
            break;
        case EV_REJOIN_FAILED:
            Serial.println(F("EV_REJOIN_FAILED"));
            break;
        case EV_TXCOMPLETE:
            Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
            if (LMIC.txrxFlags & TXRX_ACK)
              Serial.println(F("Received ack"));
            if (LMIC.dataLen) {
				
				Serial.print(F("Received "));
				Serial.print(LMIC.dataLen);
				Serial.println(F(" bytes of payload"));
            
			}
            os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send); // Configuração da próxima transmissão
            break;
        case EV_LOST_TSYNC:
            Serial.println(F("EV_LOST_TSYNC"));
            break;
        case EV_RESET:
            Serial.println(F("EV_RESET"));
            break;
        case EV_RXCOMPLETE:
            Serial.println(F("EV_RXCOMPLETE")); // Dados recebidos
            break;
        case EV_LINK_DEAD:
            Serial.println(F("EV_LINK_DEAD"));
            break;
        case EV_LINK_ALIVE:
            Serial.println(F("EV_LINK_ALIVE"));
            break;
        case EV_TXSTART:
            Serial.println(F("EV_TXSTART"));
            break;
        default:
            Serial.print(F("Unknown event: "));
            Serial.println((unsigned) ev);
            break;
			
    }
	
}

void do_send(osjob_t* j){
	
    if (LMIC.opmode & OP_TXRXPEND) { // Verifica se tem algum processo TX e RX ocorrendo
	
        Serial.println(F("OP_TXRXPEND, not sending"));
		
    } else { // Prepara os dados para envio na próxima janela

        LMIC_setTxData2(1, mydata, sizeof(mydata)-1, 0);
        Serial.println(F("Packet queued"));
		
    }
}

void setup() {
	
    Serial.begin(115200);
    delay(100);
    Serial.println(F("Starting..."));

	SPI.begin(18, 19, 23, 5); // Iniciar SPI - (SCK,MISO,MOSI,SS)

    os_init(); // Inicia biblioteca LoRaWAN
    
    LMIC_reset(); // Reinicia rádio LoRa

    do_send(&sendjob); // Inicia os trabalhos
}

void loop() {
	
    os_runloop_once(); // Loop de envio
}

Last updated