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:
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:
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”: