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 Git
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 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ı
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | #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ı
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #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