lora

Lora cz12

LoRa (long range) to technologia bezprzewodowa dalekiego zasięgu, opartej na technologii zwanej chirp spread spectrum (CSS). Przeznaczony jest do prowadzenia transmisji dalekiego zasięgu przy minimalnym zużyciu energii.

LoRa działa w różnych pasmach częstotliwości w różnych regionach. Częstotliwości dla poszczególnych krajów możemy odczytać na stronie:

  • https://www.thethingsnetwork.org/docs/lorawan/frequencies-by-country/
Specyfikacje technologii LoRa:

Standard

801.15.4g

Częstotliwość

ISM 868/915 MHz

Zakres

Do 5 km (miejskie) i 15 km (wiejskie)

Prędkość transmisji danych

27 kb/s

Modulacja

Typ modulacji Chirp Spread-spectrum oparty na technologii modulacji FM

Bezpieczeństwo

32-bitowy CRC

Zadanie

Stwórz komunikator, który będzie przesyłał wiadomości przez LoRa i wyświetlał w monitorze portu szeregowego.

Do zbudowania użyję:
  • 2x Arduino MKR WAN 1310
  • 2x Antena X000016
  • 2x kabel Micro USB
Schemat połączenia dla dwóch Arduino:
Arduino
Kod programu Arduino 1 (Jan):
#include <SPI.h>
#include <LoRa.h>

String message; // zmienna przechowująca wiadomość

byte localAddress = 0xFF;  // Adres urządzenia
byte destination = 0xBB;   // Adres urządzenia docelowego

void setup() {
  Serial.begin(9600);
  Serial.println("Komunikator LoRa");
  if (!LoRa.begin(868E6)) { // jeśli uruchomienie LoRa się nie udało
    Serial.println("Blad uruchomienia LoRa!");
    while (1);
  }
  delay(1000);
}

void loop() {
  while (Serial.available()) { // jeśli otrzymujemy cos z portu szeregowego
    delay(2);  // opóźnienie, aby bajt dotarł do bufora wejściowego
    char c = Serial.read(); // odczytaj znak i przypisz do c
    message += c; // dodaj znak do message
  }

  if (message.length() > 0) { // jeśli długość wiadomości jest większa od 0
    Serial.println("Jan: " + message); // wyświetl w porcie szeregowym
    LoRa.beginPacket(); // stwórz pakiet LoRa
    LoRa.write(destination); // ustaw adres odbiorcy
    LoRa.write(localAddress); // ustaw adres nadawcy
    LoRa.print("Jan: " + message); // wiadomość do odbiorcy
    LoRa.endPacket(); // wyślij pakiet
    message = ""; // wyczyszczenie wiadomości
  }
  
  onReceive(LoRa.parsePacket()); // funkcja odbierająca i wyświetlająca wiadomości
}

void onReceive(int packetSize) {
  if (packetSize == 0) return; // jeśli nie ma pakietu, wyjdź z funkcji

  int recipient = LoRa.read(); // odczytaj pakiet
  String incoming = ""; // inicjacja zmiennej, w której będziemy przechowywać wiadomość

  while (LoRa.available()) { 
    incoming += (char)LoRa.read(); // odczytaj wiadomość
  }

  if (recipient != localAddress && recipient != 0xBB) { // jeśli wiadomość pochodzi z innego adresu
    Serial.println("Wiadomosc nie dla ciebie");
    return; // wyjdź z funkcji
  }

  // wyświetl wiadomość i sile sygnału w monitorze portu szeregowego
  Serial.print(incoming);
  Serial.print(" || RSSI: ");
  Serial.println(LoRa.packetRssi());
  Serial.println();
}
Kod programu Arduino 2 (Tomek):

Kod dla drugiego Arduino jest identyczny, należy zamienić adres urządzenia z docelowym:

byte localAddress = 0xBB;  // Adres urządzenia
byte destination = 0xFF;   // Adres urządzenia docelowego

Oraz nazwę w wiadomości wysyłanej i wyświetlanej:

Serial.println("Tomek: " + message); // wyświetl w porcie szeregowym
LoRa.print("Tomek: " + message);     // wiadomość do odbiorcy
Efekt:

wynik

Odbierając wiadomość wyświetla nam się wiadomość oraz siła sygnału. Zdarza się również, że urządzenie odbierze wiadomość zaadresowana dla innego urządzenia. Wiadomość taka nie zostanie wyświetlona a zostaniemy wyświetlony komunikat „Wiadomość nie dla ciebie”:

wynik