rs485 lora

RS485 ile Veriyi Okuyup LoRa ile Kablosuz Gönderme

Merhabalar Dostlar, bugün sizlerle beraber sahada çokça karşınıza çıkacak RS485 protokolü üzerine bir uygulama yapacağız. Elektrik sayaçlarında, güç analizörlerinde sıklıkla kullanılan bir haberleşme protokolüdür RS485. Biz bu yazımızda uzaktan sayaç okuma sistemlerinin bir demosunu yapacağız ve güç analizöründen veriyi okuyup LoRa üzerinden uzaktaki diğer arduino noktamıza veriyi kablosuz olarak atacağız.

Kullandığım güç analizörü ENTES marka “mpr 47s-d“.

ürünün adresler kağıdı şu linkten ulaşabilirsiniz.

Ürünü seçmemde özel bir sebep yok. RS485 ayarları

Boud : 9600

Slave: 1

Parity: No

RS485 üzerine bir seri olan yazımız, ilk yazımızın devamı niteliğindedir. Eğer ilk yazımızı okumadıysanız okumanızı tavsiye ederim.

Bağlantı şemasını kabaca şu şekilde düşünebilirsiniz.

https://i.stack.imgur.com/TNlLU.png

Birebir bağlantı şemamız bu DEĞİLDİR. Sadece fikir vermesi adına ekledim. Mantık şu şekilde olacak, Arduino bir sorgu yapacak, Sorgu TTL to RS485 çevirici üzerinden analizöre gidecek. Analizörde sorguya bir cevap yazıp, aynı yoldan veriyi arduinoya yollayacak.

1.1 Gerekli Malzemeler

LoRa Uzman Seti

LoRa Uzman Seti (E22-900T22D)

Kablosuz şifreli veri iletimi ve güvenli iletişim için tasarlanmış bu set, 900 MHz frekansında çalışır ve LoRa uygulamalarında güvenli veri iletimi sağlar.

Ürün Sayfasına Git
LoRa Başlangıç Seti

LoRa Başlangıç Seti (SX1278 E32-433T20D)

LoRa teknolojisi ile tanışmak isteyenler için 433 MHz bandında çalışan, SX1278 çipli modül ve anten içeren bir başlangıç setidir.

Ürün Sayfasına Git

1 adet TTL to RS485 çevirici

1.2 Bağlantı Şeması

TTL to RS485 Çevirici
Pin NamePin Description
VCC5V (Arduino 5v beslemesi)
AAnalizör RS485 A Klemensine
BAnalizör RS485 B klemensine
GNDGND (Arduino GND)

R0

Arduino (8 pinine)
REArduino 2 Nolu pin
DEArduino 2 Nolu pin
DIArduino (9 pinine)

Lora modülü PCB de 10 ve 11 numaralı pine bağlıdır.

1.3 Kodlar

Analizör Okuma Kısmı

#include <SoftwareSerial.h>
#include "LoRa_E32.h"
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX       8  //Serial Receive pin
#define SSerialTX       9  //Serial Transmit pin

#define SSerialTxControl 2   //RS485 Direction control

#define RS485Transmit    HIGH
#define RS485Receive     LOW

#define Pin13LED         13

/*-----( Declare objects )-----*/
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX

SoftwareSerial mySerial(10, 11);
LoRa_E32 e32ttl(&mySerial);
struct Signal {
  char type[15] = "Fixaj.com";
  byte gun[3];
} data;

/*-----( Declare Variables )-----*/
int byteReceived;
int a;
String ph_hexa, ph_hexa_hight_byte, ph_hexa_low_byte, ph_hexa_value;
byte request [] = {
  0x01,
  0x03,
  0x17,
  0x70,
  0x00,
  0x01,
  0x80,
  0x65
};

/*
   şimdi burda sorgu 01 03 17 70 00 01 65 80
   entes marka mpr47s-d modelinin register tablosunda en sonda ayın gününü hesaplama sorgusu
   yukarıda dikkat edersen herşey normal taki, crc değerine gelene kadar.
   CRC değerinin sırasını ters yazacan, önce 80 sonra 65 değerini yazmalısın

    0x01, slave adersi
    0x03, okuma fonksiyonunu çağır
    0x17, 1770 adres ayın gününü veren register
    0x70,
    0x00, okunacak veri boyutu biz sadece 1 tane istediğimiz için 0001, hıgh ve low gibi düşün
    0x01,
    0x80,  crc değeri normalde 6580 ama burada ters yazacan
    0x65
    crc değerini otomatik hesaplma https://www.lammertbies.nl/comm/info/crc-calculation
*/


void setup()   /****** SETUP: RUNS ONCE ******/
{
  // Start the built-in serial port, probably to Serial Monitor
  Serial.begin(9600);
  e32ttl.begin();
  delay(500);

  Serial.println("Fixaj.com");

  pinMode(Pin13LED, OUTPUT);
  pinMode(SSerialTxControl, OUTPUT);

  digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver

  // Start the software serial port, to another device
  RS485Serial.begin(9600);   // set the data rate

}//--(end setup )---


void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{

  RS485Serial.listen();
  if (RS485Serial.available())  //Look for data from other Arduino
  {
    Serial.print("Response: ");
    for (int i = 0; i <= 6; i++) {
      byteReceived = RS485Serial.read();    // Read received byte

      ph_hexa = String(byteReceived, HEX);

      // index 3 = high byte
      if (i == 3)
      {
        ph_hexa_hight_byte =   ph_hexa;
      }

      // index 4 = low byte
      if (i == 4)
      {
        ph_hexa_low_byte =   ph_hexa;

        ph_hexa_value = ph_hexa_hight_byte + ph_hexa_low_byte;

        a = StrToHex(ph_hexa_value.c_str());

        Serial.println(a);// Show on Serial Monitor

        mySerial.listen();

        struct Signal  {
          char type[15] = "entes";
          byte gun[3];
        } data2;

        *(int*)(data2.gun) = a;


        ResponseStatus rs = e32ttl.sendFixedMessage(0, 63, 23, &data2, sizeof(Signal));
        Serial.println(rs.getResponseDescription());
        
      }
      Serial.print(" ");
    }
    /*
      Serial.println(ph_hexa);
      ph_hexa = "";
    */
    Serial.println();
  }
  else
  {
    Serial.println();
    Serial.print("Request: ");
    digitalWrite(SSerialTxControl, RS485Transmit);  // Init Transceiver
    for (int i = 0; i < 8; i++) {
      Serial.print(request[i], HEX);
      RS485Serial.write((byte)request[i]);
    }
    Serial.println();
    digitalWrite(SSerialTxControl, RS485Receive);  // Init Transmit
  }
  delay(1000);

}

int StrToHex(char str[])
{
  return (int) strtol(str, 0, 16);
}

Uzaktaki Lora Merkezimizin Kodları

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

SoftwareSerial mySerial(10, 11);

/*
   Pinler     Arduino Nano    Lora E32 433T20d
                  11                3
                  10                4
*/

LoRa_E32 e32ttl(&mySerial);

struct Signal {
  char type[15] = "Fixaj.com";
  byte gun[3];
} data;


void setup() {
  Serial.begin(9600);
  e32ttl.begin();
  delay(500);
}

void loop() {

  while (e32ttl.available()  > 1) {
    ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Signal));
    struct Signal data = *(Signal*) rsc.data;
    Serial.print("Analizör Markası: ");
    Serial.println(data.type);
    Serial.print("Ayın Günü: ");
    Serial.println(*(int*)(data.gun));
    rsc.close();
  }
}

Yazımızın detaylarını youtube videomuzda anlatmış olacağım. Özellikle sorgu nasıl oluşturulur bunu videoda detaylı öğrenebilirsiniz.

Önemli bir yazı oldu sanırım. Sahada çokça kullanabilirsiniz. İş hayatının içine girdikçe RS485 haberleşme protokolünün kullanım alanlarına şaşıracaksınız. Şimdiden öğrenmeniz ve uygulamanız iş bulma süreçlerinde size kolaylıklar sağlayacaktır.

Şimdilik anlatacaklarımız bu kadar. satın aldıktan sonra yüksek puan vermeniz bizim için önemlidir. Lütfen unutmayın

İyi günler.

RS485 ile Veriyi Okuyup LoRa ile Kablosuz Gönderme” ile ilgili 2 görüş

  1. eyüp

    merhaba,
    RS485 ile haberleştirmek için ürünlerin haberleşme protokülüne ihtiyacımız varmı?
    yani üreticiisnden bilgi almamız gerekirmi?

    ben yangın algılama sistem işi yapıyorum ana cihaz ve tekrarlıyıcı cihazlar RS485 ile haberleşiyor bazı yerlerde kablosuz aktarım yapılması gerekiyor bunu sağlamam için yukarıdaki yazdığım desteği panel üreticisinden lamalımıyım yoksa yukarıda vermiş olduğunuz örnekle haberleştirme yapabilirmiyim? Teşekkürler

  2. Mehmet Yazının yazarı

    mrb Eyüp, eğer mevcut kablolu sistemi sadece lor kullanarak kablosuz hale getirmek istersen hiç bir bilgiye gerek yok. kabloyu kesip araya lora modülü ve lora modülü uart yapıda olduğu için rx ve tx pinlerine rs485 to TTL dönüştürücü takman yeterlidir. detaylı cevap için soru cevap sayfamıza yazabilirsin devre şemasını da atabilirim

Yorumlar kapalı.