LoRa und LoRaWAN

Glück gehabt – ein LoRaWAN Gateway ist erreichbar

In meiner Nähe muss jemand in der letzten Zeit ein LoRaWAN Gateway installiert haben. Ich habe mir auch schon ein kleines LoRa Modul bestehend aus ESP8266 und RFM95 aufgebaut und kann damit Datenpakete zu THE THINGS NETWORK (oder neu… The Things Stack) senden. Hier reicht ein simple Account aus, um dann diese Paket in der Cloud weiter verarbeiten zu können. Wenn ich wieder etwas Zeit habe werde ich die gesendeten Paket zu THINGSPEAK weitersenden und hier darstellen. Mit der LoRaWAN Funktechnik kann eine Reichweite von bis zu 10Km und extrem energiesparende Baugruppen erstellen. Das Signal durchdringt auch problemlos Wände und kann auch aus Kellern versendet werden. Eine größere Batterie reicht dann bis zu 10 Jahre.

Mal sehen, vielleicht werde ich wieder einen Controller aus der Serie MSP430 verwenden. Mit kleiner Taktfrequenz reicht eine Knopfzelle um diesen 3 und mehr Jahre zu versorgen.

Vorderseite eines als RFM95 bestellten LoRaWan Modus – eindeutig steht auf dem Chip etwas von RFM96

Vorderseite RFM95 Modul - LORAWAN

Das ist die Rückseite vom gleichen Modul – siehe da, RFM95 und die für Deutschland gedachte Frequenz von 868 MHz. Trotz der optischen Unstimmigkeit funktioniert das Modul einwandfrei.

Rückseite RFM95 Modul - LORAWAN

Hier zwei Softwarebeispiele wobei der ABP-Mode nach wenigen Sekunden eine Verbindung aufbaut. Wenn man den OTAA Modus verwendet, kann der Verbindungsaufbau auch schon mal 30 Minuten und mehr dauern.

Ich habe hier die Bibliothek von „Beelan_LoRaWAN“ verwendet.

Es ist unbedingt erforderlich, die Datei „config.h“ auf die in Deutschland zu verwendenden Frequenzen anzupassen.

/**
   Example of ABP device
   Authors:
          Ivan Moreno
          Eduardo Contreras
    June 2019

   This code is beerware; if you see me (or any other collaborator
   member) at the local, and you've found our code helpful,
   please buy us a round!
   Distributed as-is; no warranty is given.
*/
#include 

#define LED        2                                        // Port Wemos D4 = GPIO 2

//ABP Credentials
const char *devAddr = "26123456";
const char *nwkSKey = "09C4903E584EC02E4CA50123456789BB";
const char *appSKey = "D247B2E00721C3CCD3EB01234567895D";

const unsigned long interval = 30000;                        // 30 s interval to send message
unsigned long previousMillis = 0;                            // will store last time message sent
unsigned int counter = 80;                                   // message counter

char myStr[50];
char outStr[255];
byte recvStatus = 0;

const sRFM_pins RFM_pins = {
  .CS = 16,
  .RST = 2,
  .DIO0 = 15,
  .DIO1 = 2,
  .DIO2 = 2,
  .DIO5 = 2,
};

void setup() {
  pinMode(LED, OUTPUT);                                     // LED pin is output
  digitalWrite(LED, HIGH);                                  // LED off
  // Setup loraid access
  Serial.begin(9600);
  while (!Serial);
  if (!lora.init()) {
    Serial.println("RFM95 not detected");
    delay(1000);
    return;
  }

  // Set LoRaWAN Class change CLASS_A or CLASS_C
  lora.setDeviceClass(CLASS_A);

  // Set Data Rate
  lora.setDataRate(SF7BW125);

  // set channel to random
  lora.setChannel(MULTI);

  // Put ABP Key and DevAddress here
  lora.setNwkSKey(nwkSKey);
  lora.setAppSKey(appSKey);
  lora.setDevAddr(devAddr);
}

void loop() {
  // Check interval overflow
  if (millis() - previousMillis > interval) {
    previousMillis = millis();

    sprintf(myStr, "Counter-%d", counter);

    Serial.print("Sending: ");
    Serial.println(myStr);

    lora.sendUplink(myStr, strlen(myStr), 0, 1);
    counter++;
    if(counter>90) counter=80;
    digitalWrite(LED, LOW);                                   // LED short on
    delay(50);
    digitalWrite(LED, HIGH);                                  // LED off
    delay(950);
  }

  recvStatus = lora.readData(outStr);
  if (recvStatus) {
    Serial.println(outStr);
  }

  // Check Lora RX
  lora.update();
}
/**
Example of OTAA device
Authors:
Ivan Moreno
Eduardo Contreras
June 2019

This code is beerware; if you see me (or any other collaborator
member) at the local, and you've found our code helpful,
please buy us a round!
Distributed as-is; no warranty is given.
*/
#include

#define LED 2 // Port Wemos D4 = GPIO 2

// OTAA credentials
const char *devEui = "1ACB012345678901";
const char *appEui = "70B3012345678901";
const char *appKey = "FC1D25A7309E36C8FC27701234567891";

const unsigned long interval = 20000; // 20 s interval to send message
unsigned long previousMillis = 0; // will store last time message sent
unsigned int counter = 0; // message counter

char myStr[50];
char outStr[255];
byte recvStatus = 0;

const sRFM_pins RFM_pins = {
.CS = 16,
.RST = 2,
.DIO0 = 15,
.DIO1 = 2,
.DIO2 = 2,
.DIO5 = 2,
};

void setup() {
pinMode(LED, OUTPUT); // LED pin is output
digitalWrite(LED, HIGH); // LED off
// Setup loraid access
Serial.begin(9600);
while (!Serial);
if (!lora.init()) {
Serial.println("RFM95 not detected");
delay(5000);
return;
}

// Set LoRaWAN Class change CLASS_A or CLASS_C
lora.setDeviceClass(CLASS_A);

// Set Data Rate
lora.setDataRate(SF9BW125);

// set channel to random
lora.setChannel(MULTI);

// Put OTAA Key and DevAddress here
lora.setDevEUI(devEui);
lora.setAppEUI(appEui);
lora.setAppKey(appKey);

// Join procedure
bool isJoined;
do {
Serial.println("Joining...");
isJoined = lora.join();

//wait for 10s to try again
digitalWrite(LED, LOW); // LED on
delay(50);
digitalWrite(LED, HIGH); // LED on
delay(950);
} while (!isJoined);
Serial.println("Joined to network");
digitalWrite(LED, HIGH); // LED on
}

void loop() {
// Check interval overflow
if (millis() - previousMillis > interval) {
previousMillis = millis();

sprintf(myStr, "Counter-%d", counter);

Serial.print("Sending: ");
Serial.println(myStr);

lora.sendUplink(myStr, strlen(myStr), 0, 1);
counter++;
}

recvStatus = lora.readData(outStr);
if (recvStatus) {
Serial.println(outStr);
}

// Check Lora RX
lora.update();
}