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
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 GitLoRa 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 Git1 adet TTL to RS485 çevirici
1.2 Bağlantı Şeması
Pin Name | Pin Description |
VCC | 5V (Arduino 5v beslemesi) |
A | Analizör RS485 A Klemensine |
B | Analizör RS485 B klemensine |
GND | GND (Arduino GND) |
R0 | Arduino (8 pinine) |
RE | Arduino 2 Nolu pin |
DE | Arduino 2 Nolu pin |
DI | Arduino (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.
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
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