Multi Lora Nodes

Multi Lora Nodes

Merhaba Arkadaşlar bu yazımızda merak edilen çoklu lora ağı üstünde bir çalışma yapacağız. İngilizcesi aslında daha kulağa hoş geliyor Multi Lora Nodes, bu konu hakkında ben sağlıklı bir kaynak bulamadım internette, hatta üretici firmaya sorduğumda bana farklı lora modüllerini önerdiler. Ancak ben bunu E22 ve E32 lora modülleri nasıl yapabiliriz onu araştırdım.

Firma buna Yıldız bağlantı şekli diyor. Star network, burada bir kaç anahtar kelime var “Data Collision” , “multi slave & single master” “simultaneously” internette bu konular hakkında araştırma yapabilirsiniz.

Hatta şurada firmanın E70 dtu modelleri ile yaptığı bir videoda var: https://www.youtube.com/watch?v=pFL-_SaLFrA

Ancak ben bunu daha uygun fiyatlı olan E22 ve E32 modelleri ile yapmaya çalıştım. Sonuç olarak 750ms altında bir tarama hızına ulaştım. hatta bulduğum yöntem ile bu süreyi çok çok daha kısa sürelere çekebilirsiniz.

Multi Lora

Kullandığım Malzemeler

3in1 Shield NANO
3in1 Shield NANO
3in1 Shield NANO
3in1 Shield NANO

Video

Kodlar

Nodes, yanı bizim ölçüm noktaları, ben burada kabaca bir GPS verisi ve gerilim değeri gönderiyorum cihaz id si ile birlikte.

#include "LoRa_E22.h"
#include <SoftwareSerial.h>

SoftwareSerial mySerial(3, 4); //PCB versiyon 4.3 den sonra bu şekilde olmalı
LoRa_E22 E22(&mySerial);

#define M0 7
#define M1 6

struct Signal {
  char type[10] = "Urfa63";
  byte id;
  byte lat[6];
  byte lng[6];
  byte volt[6];
} data;



void setup() {
  pinMode(M0, OUTPUT);
  pinMode(M1, OUTPUT);
  digitalWrite(M0, LOW);
  digitalWrite(M1, LOW);

  Serial.begin(9600);
  E22.begin();
  delay(500);
}

void loop() {

  while (E22.available() > 1) {

    // Gelen mesaj okunuyor
    ResponseStructContainer rsc = E22.receiveMessage(sizeof(Signal));
    struct Signal data = *(Signal*)rsc.data;
    Serial.print("Gelen Messaj: ");
    Serial.println(data.type);
    rsc.close();


    data.id = 7;
    *(float*)(data.lat) = 26.123;
    *(float*)(data.lng) = 36.312;
    *(float*)(data.volt) = 4.212;


    ResponseStatus rs = E22.sendFixedMessage(0, 4, 23, &data, sizeof(Signal));
    Serial.println(rs.getResponseDescription());
  }
}

Tarama noktası ben buna verici TX noktası diyeceğim

#include "LoRa_E22.h"
#include <SoftwareSerial.h>

SoftwareSerial mySerial(3, 4); //PCB versiyon 4.3 den sonra bu şekilde olmalı
LoRa_E22 E22(&mySerial);

#define M0 7
#define M1 6

byte SensorSays = 5;
const byte Frekanslar[] = { 1, 2, 3,6,7 };
byte mevcutLora = 0;

struct Signal {
  char type[10] = "Urfa63";
  byte id;
  byte lat[6];
  byte lng[6];
  byte volt[6];
} data;



void setup() {
  pinMode(M0, OUTPUT);
  pinMode(M1, OUTPUT);
  digitalWrite(M0, LOW);
  digitalWrite(M1, LOW);

  Serial.begin(9600);
  E22.begin();
  delay(500);
}

void loop() { 

    for (mevcutLora = 0; mevcutLora < SensorSays; mevcutLora++) {
      int deger1 = mevcutLora + 1;
      String text1 = ". Sensörün değerleri alınıyor...";
      String sum1 = deger1 + text1;
      Serial.println(sum1);

      ResponseStatus rs = E22.sendFixedMessage(0, Frekanslar[mevcutLora], 23, &data, sizeof(Signal));
      Serial.println(rs.getResponseDescription());

      delay(750);
    }   
}

Alıcı yani Master, Esas noktamız burası

#include "LoRa_E22.h"
#include <SoftwareSerial.h>

SoftwareSerial mySerial(3,4); //PCB versiyon 4.3 den sonra bu şekilde olmalı
LoRa_E22 E22(&mySerial);

long a = 0;

#define M0 7
#define M1 6

struct Signal {
  char type[10];
  byte id;
  byte lat[6];
  byte lng[6];
  byte volt[6];
} data;



void setup() {
  pinMode(M0, OUTPUT);
  pinMode(M1, OUTPUT);
  digitalWrite(M0, LOW);
  digitalWrite(M1, LOW);

  Serial.begin(9600);
  E22.begin();
  delay(500);
}

void loop() {

  while (E22.available() > 1) {
    a = millis();
    // Gelen mesaj okunuyor
    ResponseStructContainer rsc = E22.receiveMessage(sizeof(Signal));
    struct Signal data = *(Signal*)rsc.data;
    rsc.close();

    Serial.print("Gelen Messaj: ");
    Serial.print(data.type);
    Serial.print(" ,id: ");
    Serial.print(data.id);
    Serial.print(", Lat: ");
    Serial.print(*(float*)data.lat, 6);
    Serial.print(", lng: ");
    Serial.print(*(float*)data.lng, 6);
    Serial.print(", volt: ");
    Serial.print(*(float*)data.volt, 4);

    Serial.print(" ,işlem süresi: ");
    Serial.println(millis() - a);
  }
}

Parametre Ayarları

Lora modüllerinin Parametre Ayar ekranı

Packet Size” küçülterek işlemlerin hızlanmasını sağlıyorum ama çok etkili değil bilginiz olsun. “Tran mode” fixed yapmayı unutmayın. Adresleri de 1,2,3,4,5,6,7 şeklinde yaptım. 4 genel alıcı Master, 5 genel verici TX, 1,2,3 ve 6,7 ise bizim ölçüm noktalarının adresleri. Bütün lora modüllerinde sadece adresler farklı bunun dışındaki ayarların birebir aynı olması lazım.

Devre Şeması