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.

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

E32 433T20D2 adet E32 433T20D satın Almak için Tıklayın ->

1 adet TTL to RS485 çevirici

2 Adet hazır PCB satın almak için tıklayın ->

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. N11 mağazamızdan satın aldıktan sonra yüksek puan vermeniz bizim için önemlidir. Lütfen unutmayın

İyi günler.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir