Çözüldü1.31K görüntülenmeLorars485
0

merhaba ,

örnek kodlarda kullandığınız Entes ve lora çalışması ile ilgili bir sorum olacak. Örnek çalışmada bulunan “SoftwareSerial RS485Serial(SSerialRX, SSerialTX);” tanımlaması sebebi ile Loranın tanımladığımız SoftwareSerial mySerial(10, 11);  LoRa_E32 e32ttl(&mySerial); fonksiyonlarından olan  

while (e32ttl.available() > 1) fonksiyonu çalışmıyor. Bu fonksiyonu da kullanmazsak bu sefer de RS485 okumasından sonra gelen kendisine ait adres numarasını beklemeden veriyi açığa gönderiyor. bu da ana merkez alıcıda karışıklığa sebep oluyor. şöyle 2 numaralı cihaza ait değerler okunmak istendiğinde örneğin 4 numaralı cihazın verileri geliyor. sorun bu şekilde . kodları aşağıda paylaştık. sizce nerde yanlış yapıyoruz?

iyi çalışmalar.

master (ana merkez alıcı)

#include “LoRa_E32.h”
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11);
LoRa_E32 e32ttl(&mySerial);

struct Signal {
char type[15]=”veri”;
byte adres[2];
byte l1volt[4];
byte l2volt[4];
byte l3volt[4];
} data;

int m=2; // ilk lora adersi
int durum; // veriler alınınca değer 0, veriler alınamayınca değer 1

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

}

void loop() {

struct Giden {
char type[15];
byte adres[2];
} data;
*(int*)(data.adres)=m;

delay(10);
// veri göndermek için kullanılan kalıp
ResponseStatus rs = e32ttl.sendFixedMessage(0, m, 23, &data, sizeof(Giden));
rs.getResponseDescription();

delay(5000);

Serial.println(m);
Serial.print(“……”);
durum=1;

// veri almak için kullanılan kalıp
while (e32ttl.available() > 1)
{

durum=0;
ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Signal));
struct Signal data = *(Signal*) rsc.data;
Serial.print(*(int*)(data.adres));
Serial.print(“*”);
Serial.print(*(float*)(data.l1volt));
Serial.print(“*”);
Serial.print(*(float*)(data.l2volt));
Serial.print(“*”);
Serial.println(*(float*)(data.l3volt));
rsc.close();
}

//Bağlantı olmaz ise gönderilecek değer.
if(e32ttl.available()<1 && durum==1)
{
Serial.print(m);
Serial.print(“*”);
Serial.print(0.00);
Serial.print(“*”);
Serial.print(0.00);
Serial.print(“*”);
Serial.print(0.00);
Serial.print(“!”);
Serial.println(“Bağlantı Yok”);
}

delay(50);
m=m+1;
delay(50);
if(m==11)
m=2;
delay(10);
}

//// verici lora kodları RS485 ile ////

#include “LoRa_E32.h”
#include <SoftwareSerial.h>

#define SSerialRX 8
#define SSerialTX 9
#define SSerialTxControl 2
#define RS485Transmit HIGH
#define RS485Receive LOW

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

SoftwareSerial mySerial(10, 11); // Arduino RX <– e32 TX, Arduino TX –> e32 RX
LoRa_E32 e32ttl(&mySerial);

struct Gelen {
char type[15];
byte temp[4];
} data;

/*—–( Declare Variables )—–*/
int byteReceived;
float a,b,c,d,e;
int f=0; // RS485 okuması sırasında değer 0, okunan verileri gönderme döngüsünde değer 1.
int z=0; // alıcıdan gelen veri göndermesi beklenen lora numarası.

String ph_hexa, ph_hexa_hight_byte, ph_hexa_low_byte, ph_hexa_value;

byte R_fazi [] = {0x01,0x03,0x10,0x02,0x00,0x01,0x21,0x0A};
byte S_fazi [] = {0x01,0x03,0x10,0x03,0x00,0x01,0x70,0xCA};
byte T_fazi [] = {0x01,0x03,0x10,0x04,0x00,0x01,0xC1,0x0B};

float r=0;
float w=0;
float t=0;

void setup()

{
Serial.begin(9600);
e32ttl.begin();
delay(500);

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

}

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

void loop() {

while(f==0){
delay(10);

RS485Serial.listen();

for(int s=0;s<6;s++)
{
if (RS485Serial.available()) //Look for data from other Arduino
{

for (int i = 0; i <= 6; i++) {
byteReceived = RS485Serial.read(); // Read received byte
ph_hexa = String(byteReceived, HEX);

if (i == 3)
{
ph_hexa_hight_byte = ph_hexa;
}

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());
b=a/10;

if(s==1)
c=a/10;
if(s==3)
d=a/10;
if(s==5)
e=a/10;

Serial.print(s);
Serial.print(“-“);
Serial.println(b);

}
}

ph_hexa = “”;
b=0;
delay(2000);

if(s==5){
/* Serial.print(“4”);
Serial.print(“*”);
Serial.print(c);
Serial.print(“*”);
Serial.print(d);
Serial.print(“*”);
Serial.println(e);
*/f=1;

}

}

else
{
if(s==0){
Serial.print(“Sorgu Adresi_1: “);
digitalWrite(SSerialTxControl, RS485Transmit); // Init Transceiver
for (int i = 0; i < 8; i++) {
Serial.print(R_fazi[i], HEX);
RS485Serial.write((byte)R_fazi[i]);
}
Serial.println();
digitalWrite(SSerialTxControl, RS485Receive); // Init Transmit
}
delay(100);
if(s==2){
Serial.print(“Sorgu Adresi_1: “);
digitalWrite(SSerialTxControl, RS485Transmit); // Init Transceiver
for (int i = 0; i < 8; i++) {
Serial.print(S_fazi[i], HEX);
RS485Serial.write((byte)S_fazi[i]);
}
Serial.println();
digitalWrite(SSerialTxControl, RS485Receive); // Init Transmit
}
delay(100);
if(s==4){
Serial.print(“Sorgu Adresi_1: “);
digitalWrite(SSerialTxControl, RS485Transmit); // Init Transceiver
for (int i = 0; i < 8; i++) {
Serial.print(T_fazi[i], HEX);
RS485Serial.write((byte)T_fazi[i]);
}
Serial.println();
digitalWrite(SSerialTxControl, RS485Receive); // Init Transmit
}
delay(100);
}

}

}

while(f==1){
while (e32ttl.available() > 1)

{
// Gelen mesaj okunuyor
ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Gelen));
struct Gelen data = *(Gelen*) rsc.data;
Serial.print(“Gelen Messaj: “);
Serial.println(*(int*)(data.temp));
rsc.close();
int z=*(int*)(data.temp);
Serial.print(z);
delay(50);

if(z==4)
{
struct Signal {
char type[15];
byte adres[2];
byte l1volt[4];
byte l2volt[4];
byte l3volt[4];
} data2;

*(int*)(data2.adres)=4;
*(float*)(data2.l1volt)= c;
*(float*)(data2.l2volt)=d;
*(float*)(data2.l3volt)=e;

ResponseStatus rs = e32ttl.sendFixedMessage(0, 01, 23, &data2, sizeof(Signal));
rs.getResponseDescription(); // bağlantı başarılı yazısını yazan kısım SUCCES.
Serial.println(“mesaj gitti”);
delay(10);
f=0;
}
else
{
z=0;
}
}
}
delay(1000);
}

n11 sipariş kodu: 206779535218

Soru yeni cevaplara kapalıdır.
hüseyin öztürk En iyi cevap olarak seçildi Eylül 20, 2022

Merhaba,
O videoya göre yaptık. Sorun şu ki RS485 veri okumasını bitirince hemen lora ile veriyi gönderiyor. Biz ise uzak nokta alıcı lora kendi id bumarası ile ona istek gönderince okuduğu değeri göndermesini istiyoruz. Linkini gönderdiğiniz örneği yağtık sorun yok. Bizim kodlarımızda da okuma üç register için de yapıldı yine sorun yok çalışıyor. Sorun iki çihaz olunca birinci cihazın okunan değeri ile ikinci cihazın okunan değeri , uzak nokta loranın kendi id numarası ile isteğini bekelemeden veri göndermesi. RS485Serial.listen(); fonsuyonunu while (e32ttl.available() > 1) komutu içerisinde çalıştırabilsek sorun çözülüyor. Bu komut ile id numarası kendisine ait olan lora okuduğu verileri listen fonkuyonu ile gönderecek. Umarım anlatabilmişizdir. Teşekkürler.

0

aynı anda iki software serial için  RS485Serial.listen(); şeklinde listen komutunu kullanman lazım. örnek kod olarak hangi sayfaya baktın bu sayfadaki örnek tam senin istediğin gibi videosuda var. https://fixaj.com/rs485-ile-veriyi-okuyup-lora-ile-kablosuz-gonderme/

Mehmet Yeni yorum gönderildi Eylül 20, 2022

Merhaba,
O videoya göre yaptık. Sorun şu ki RS485 veri okumasını bitirince hemen lora ile veriyi gönderiyor. Biz ise uzak nokta alıcı lora kendi id bumarası ile ona istek gönderince okuduğu değeri göndermesini istiyoruz. Linkini gönderdiğiniz örneği yaptık sorun yok. Bizim kodlarımızda da okuma üç register için de yapıldı yine sorun yok çalışıyor. Sorun iki çihaz olunca birinci cihazın okunan değeri ile ikinci cihazın okunan değeri , uzak nokta loranın kendi id numarası ile isteğini bekelemeden veri göndermesi. RS485Serial.listen(); fonsuyonunu while (e32ttl.available() > 1) komutu içerisinde çalıştırabilsek sorun çözülüyor. Bu komut ile id numarası kendisine ait olan lora okuduğu verileri listen fonkuyonu ile gönderecek. Umarım anlatabilmişizdir. Teşekkürler.

anlamadım ama sanırım sozun çözülmül eğer devam ediyorsa whatsaptan bi vdeou at belki anlarım