LoRa RA-02 sx1278

Suren
Offline
Зарегистрирован: 19.12.2017
 
Добрый день.
У кого есть опыт работы с модулями LoRa sx1278?
На TX части при создании пакета для отправки ...

 

  LoRa.beginPacket();
  LoRa.print(a);
  LoRa.print(b);
  LoRa.print(c);
  LoRa.endPacket();
 
есть 3 переменных a,b,c , при значении которых на RX  части должны включится 3 реле.
Проблема в том,что на RX части мы получаем строка-текст где написаны значения 3-х переменных из TX...
 
String LoRaData; 
  int packetSize = LoRa.parsePacket();
  if (packetSize) 
 {
    Serial.print("Received packet '");
    while (LoRa.available())
   {
      LoRaData = LoRa.readString();
      Serial.print(LoRaData);
   }
}
 
В итоге получаем...
 
Received packet  abc
 
Никак не получается привязывать значения a,b и c на каких либо переменных на RX части и при значении последных  включить/отключить 3 реле.
 
v258
Offline
Зарегистрирован: 25.05.2020

Не работал с лорой, но чисто житейски, так сказать, а если разбивать переменные на отдельные пакеты?

  LoRa.beginPacket();
  LoRa.print(a);
  LoRa.endPacket();

  LoRa.beginPacket();
  LoRa.print(b);
  LoRa.endPacket();

  LoRa.beginPacket();
  LoRa.print(c);
  LoRa.endPacket();

Или, если нужно именно одним пакетом, упаковывать все в один байт 

a= B101; // первое и третье реле включить, второе отключить

как устанавливать нужные биты и как считывать нужные биты в байте - см. битовые операции

 

Suren
Offline
Зарегистрирован: 19.12.2017

Пробовал отправить 3 пакета. На RX получаю только последный пакет

LoRa.beginPacket();
LoRa.print(c);
LoRa.endPacket();
 
То есть надо все переменные отправить в одном пакете. А там на RX как-то надо извлечь эти переменные а не просто отобразить на serial monitor.  
 

 

v258
Offline
Зарегистрирован: 25.05.2020

Тогда паковать в байт и отправлять одним числом, а в приемной части разбирать на биты

Макросы Arduino.h 	Действие
bitRead(value, bit)	Читает бит под номером bit в числе value
bitSet(value, bit)	Включает (ставит 1) бит под номером bit в числе value
bitClear(value, bit)	Выключает (ставит 0) бит под номером bit в числе value
bitWrite(value, bit, bitvalue)	Ставит бит под номером bit в состояние bitvalue (0 или 1) в числе value

 

Suren
Offline
Зарегистрирован: 19.12.2017
String LoRaData; 
  int packetSize = LoRa.parsePacket();
  if (packetSize) 
  {
    Serial.print("Received packet '");
    while (LoRa.available())
  {
      LoRaData = LoRa.readString();
      Serial.print(LoRaData);
  }
 
  }

Если скажем 

a=25, b=30, c=35 

то на RX получаем не число 253035 а текст 253035

v258
Offline
Зарегистрирован: 25.05.2020

Зачем вам для включения реле число 25?

Смотрите. Вся информация в цифровом мире передается в виде байтов. Каждый байт состоит из восьми бит. Каждый бит может принимать два состояния - 0 и 1. Т.е., например, число 170 в двоичном виде отображается так - B10101010.

Далее. По странному, но счастливому совпадению в C++ булевы константы имеют следующие значение - false == 0, true == 1. Это вам ничего не напоминает? Правильно, один байт может содержать восемь состояний, т.е. для вашего случая в одном байте можно закодировать состояние целых восьми реле. Т.е. для передачи команды вам достаточно одного числа, а не трех, как вы делаете сейчас.

Более того. По не менее странному, но и не менее счастливому совпадению значения логических уровней так же имеют следующие значения - LOW == 0, HIGH == 1. Видите, как все прекрасно совпадает? ))

Иными словами, вот так примерно вы кодируете нужные вам биты:

byte a = 0;
bitWrite(a, 0, true);  // первое реле включить
bitWrite(a, 1, false); // второе реле выключить
bitWrite(a, 2, true);  // третье реле включить

а вот так разбираете полученное число и управляете своими реле

for (byte i = 0; i < 3; i++)
{
  digitalWrite(i, bitRead(a, i); // при условии, что ваши реле сидят на пинах 0, 1, 2
}

Как конвертировать в число строку, полученную из RX, уж сами погуглите ))

Suren
Offline
Зарегистрирован: 19.12.2017

Дело в том, что значения a b и c на TX части не просто числа.Это значения температуры влажности и давления из соответствующих датчиков.То есть они все время меняются. И при, скажем, температуре 25 градусов надо на RX части включить реле.При влажности 30% на RX части надо отключить реле.То же самое о давлении.То есть надо все три числа получить на RX части так,как они есть.Так и получается, но в виде текста.

v258
Offline
Зарегистрирован: 25.05.2020

Разбить строку на три части и конвертировать каждую их них в число - разве это сложно?

Suren
Offline
Зарегистрирован: 19.12.2017

Я думал об этом. А если первое число трехзначное,, второе число двухзначное а третье число опять трехзначное.Как делать тогда?

 

на пример

105 48 760 (10548760)

v258
Offline
Зарегистрирован: 25.05.2020

Думайте еще. Ваша задача - организовать передачу данных, значит нужно продумать формат представления этих данных. Например, вы можете сразу на передающей стороне формировать строку нужной длины - "0012", "0125", "2548", "0005". Тогда и на приемной стороне проблем с разбивкой строки не будет

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Если надо пакетом, то проще структуру сделать. Навскидку:

#pragma pack(push,1)
typedef struct _packet
{
	uint16_t a;
	uint16_t b;
	uint16_t c;
	
	_packet(uint16_t _a, uint16_t _b, uint16_t _c) : a(_a), b(_b), c(_c) {}
	
}LoRaPacket;
#pragma pack(pop)


// передача
LoRaPacket packet(1,2,3);
LoRa.beginPacket();
LoRa.write(&packet,sizeof(packet));
LoRa.endPacket();

// приём
if(LoRa.available() >= sizeof(LoRaPacket))
{
	LoRa.read(&packet,sizeof(packet));
	
	Serial.print("a="); Serial.println(packet.a);
	Serial.print("b="); Serial.println(packet.b);
	Serial.print("c="); Serial.println(packet.c);
}

 

Suren
Offline
Зарегистрирован: 19.12.2017

функции не работают.

Suren
Offline
Зарегистрирован: 19.12.2017

Sender


#include <SPI.h>
#include <LoRa.h>
int a;
int b;
int c;

void setup() {
  Serial.begin(9600);
  while (!Serial);

  Serial.println("LoRa Sender");
  
    if (!LoRa.begin(415E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
  LoRa.setSyncWord(0xF3);
  LoRa.setTxPower(20);
}

void loop() 
{
  Serial.println("Sending packet: ");
  // send packet
  LoRa.beginPacket();
  LoRa.print(a);
  LoRa.print(b);
  LoRa.print(c);
  LoRa.endPacket();
  
  a++; //
  b++; //to see the changings of a,b,c on RX side
  c++; //

  delay(1000);
}

Receiver


#include <SPI.h>
#include <LoRa.h>

void setup() {
  //initialize Serial Monitor
  Serial.begin(9600);
  while (!Serial);
  Serial.println("LoRa Receiver");

  if(!LoRa.begin(415E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
   LoRa.setSyncWord(0xF3);
   Serial.println("LoRa Initializing OK!");
  }
  
void loop() 
{
  String LoRaData; 
  int packetSize = LoRa.parsePacket();
  if (packetSize) 
  {
    Serial.print("Received packet ");
    while (LoRa.available())
    {
      LoRaData = LoRa.readString();
      Serial.println(LoRaData); 
    }
  }
}

 

Suren
Offline
Зарегистрирован: 19.12.2017
LoRa Receiver
LoRa Initializing OK!
 
Received packet 000
Received packet 111
Received packet 222
Received packet 333
Received packet 444
Received packet 555
Received packet 666
Received packet 777
Received packet 888
Received packet 999
Received packet 101010
Received packet 111111
Received packet 121212
Received packet 131313
Received packet 141414
Received packet 151515
Received packet 161616
Received packet 171717
Received packet 181818
Received packet 191919
Received packet 202020
Received packet 212121
Received packet 222222
Received packet 232323
Received packet 242424
Received packet 252525
Received packet 262626
Received packet 272727
Received packet 282828
Received packet 292929
Received packet 303030
Received packet 313131
Received packet 323232
Received packet 333333
Received packet 343434
Received packet 353535
Received packet 363636
Received packet 373737
Received packet 383838
Received packet 393939
 и так дале
b707
Онлайн
Зарегистрирован: 26.05.2017

как написано - так и работает. Вы совсем не читаете. что вам советуют? - вам же написали, что печатать подряд несколько цифр бессмысленно - они будут путаться, что у вас и наблюдается.

вам надо разработать свой протокол, который четко отделял бы одну цифру от другой. Например можете вставить между цифрами какой-нить знак, скажем, "|". Тогда при отсылке трех единиц у вас будет не 111, а "1|1|1". потом  "2|2|2" и так далее до "39|39|39"

Но лучше, конечно, передавать в двоичном виде, как советует DIYMan

 

Suren
Offline
Зарегистрирован: 19.12.2017

Да я могу разделить цифры.Это не проблема. Могу делать так, чтоб показывал ...

Received packet Temperature - 105 C; Hummidity - 48%; Pressure - 760mmHg

проблема не в этом.проблема в том,что я хочу привязывать 105 к переменному,скажем, t и написать

if (t <= 80)

{

digitalwrite(pin5, HIGH);

}

Я не хочу,просто на мониторе посмотреть значения a,b,c.

Я знаю что мне надо.А как делать не знаю.

b707
Онлайн
Зарегистрирован: 26.05.2017

если вы можете получить отдельно a b c - что мешает написать

if (a < 100) {
.....
}

if (b > 1) {
.....
}

и тому подобное?

И непонятно, нафига вы полтора десятка сообщений обсуждали передачу символов по Лора, если проблема совсем не в этом?

Suren
Offline
Зарегистрирован: 19.12.2017

В RX части нету a b c, потому что пакет получается целиком и имя пакета LoRaData.

Если написать if(a<100) {} и так далее, то это как написать if(n<100) {}. переменная   a не существует так же как не существует переменная n.То есть то что передается от TX, на RX получается в виде текста и имя этого текста LoRaData. В RX части нету a b c, есть их значения в виде текста.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Пздц.

b707
Онлайн
Зарегистрирован: 26.05.2017

Suren пишет:

В RX части нету a b c, потому что пакет получается целиком и имя пакета LoRaData.

вы же только что написали, что можете разделить a b и c отдельно? - так разделите сначала, а потому будем обсуждать дальше

Цитата:

Если написать if(a<100) {} и так далее, то это как написать if(n<100) {}. переменная   a не существует так же как не существует переменная n.

что за бред? вы за два года занятий ардуино не научились описывать переменные?

v258
Offline
Зарегистрирован: 25.05.2020

Принять строку, распарсить ее, присвоить переменным a, b, c соответствующие значения и работать уже с ними. Если нужно - конвертировать строки в числа. В чем проблема-то?

ЗЫ: вопреки мнению чайников, компьютер - крайне тупая железка, которая никогда не делает то, что от него хотят. Он всегда делает то, что ему приказывают. А МК в сравнении с компьютером - и вовсе инфузория бессловесная. Это я к чему? Не ждите, что он выдаст вам нужные вам данные сам - он думать не умеет. Думать за него должны вы

Suren
Offline
Зарегистрирован: 19.12.2017

Проблема в том, что я не могу делать это.Все говорят "надо делать это, надо делать то".Я знаю что надо делать.

А как делать? Кто нибудь скажет?

v258
Offline
Зарегистрирован: 25.05.2020

По-моему это уже троллинг 

Suren
Offline
Зарегистрирован: 19.12.2017

Да причем тут описание переменных. Если я напишу..

int a;

int b;

int c;

все равно это не те  a b c что передались от TX.

v258
Offline
Зарегистрирован: 25.05.2020

v258 пишет:

Принять строку, распарсить ее, присвоить переменным a, b, c соответствующие значения и работать уже с ними. Если нужно - конвертировать строки в числа. В чем проблема-то?

Suren
Offline
Зарегистрирован: 19.12.2017

Уважаемые господа. Проблема в знании. Я не знаю как делать.Если кто нибудь знает, подскажите пожалуйста.

v258
Offline
Зарегистрирован: 25.05.2020
Suren
Offline
Зарегистрирован: 19.12.2017

.

Suren
Offline
Зарегистрирован: 19.12.2017

v258 пишет:

Строка у вас уже есть. Далее:

с++ разбить строку по разделителю

с++ конвертировать string в int

 

Ссылки не работают

b707
Онлайн
Зарегистрирован: 26.05.2017

Suren пишет:

Уважаемые господа. Проблема в знании. Я не знаю как делать.Если кто нибудь знает, подскажите пожалуйста.

еще раз - вы написали, что знаете, как разделить вывод a b c отдельно. Если да - пожалуйста, выложите код. как вы это деоаете

v258
Offline
Зарегистрирован: 25.05.2020

Так скопируйте эти строки и забейте их в поисковую строку. Хоть Яндекса, хоть Гугла

b707
Онлайн
Зарегистрирован: 26.05.2017

Сурен, вы два года назад уже спрашивали почти то же самое - и я вам тогда отвечал. Что, неужели за 2 года вы ничему не научились ?

http://arduino.ru/forum/programmirovanie/kak-peredat-znachenie-ne-tekst-cherez-433mhz-moduli-dlya-arduino

b707
Онлайн
Зарегистрирован: 26.05.2017

Suren пишет:

Уважаемые господа. Проблема в знании. Я не знаю как делать.Если кто нибудь знает, подскажите пожалуйста.

с запросами "я не знаю как сделать. сделайте за меня" - в платный раздел.

Suren
Offline
Зарегистрирован: 19.12.2017

b707 пишет:

Suren пишет:

Уважаемые господа. Проблема в знании. Я не знаю как делать.Если кто нибудь знает, подскажите пожалуйста.

еще раз - вы написали, что знаете, как разделить вывод a b c отдельно. Если да - пожалуйста, выложите код. как вы это деоаете

Если в TX части написать 

  LoRa.beginPacket();
  LoRa.print("Temperature ");
  LoRa.print(a);
  LoRa.print(", Hummidity ");
  LoRa.print(b);
  LoRa.print(", Pressure ");
  LoRa.print(c);
  LoRa.endPacket();

то на RX части получим на Serial monitor 

LoRa Receiver

LoRa Initializing OK!
 
Received packet Temperature 0, Hummidity 0, Pressure 0
Received packet Temperature 1, Hummidity 1, Pressure 1
Received packet Temperature 2, Hummidity 2, Pressure 2
Received packet Temperature 3, Hummidity 3, Pressure 3
 
0,1,2,3 условные цифра от TX

 

 

v258
Offline
Зарегистрирован: 25.05.2020

А если в передающей части написать

LoRa.beginPacket();
LoRa.print(a);
LoRa.print("|");
LoRa.print(b);
LoRa.print("|");
LoRa.print(c);
LoRa.endPacket();

То в принимающей вы получите строку "a|b|c". Дальше разбиваете строку на части по разделителю "|", полученные части конвертируете в числа и присваиваете их нужным вам переменным

Suren
Offline
Зарегистрирован: 19.12.2017

b707 пишет:

Suren пишет:

Уважаемые господа. Проблема в знании. Я не знаю как делать.Если кто нибудь знает, подскажите пожалуйста.

с запросами "я не знаю как сделать. сделайте за меня" - в платный раздел.

Я не сказал делайте за меня,я сказал подскажите.А если, ко всем уважением, Вам жалко делится знаниями,то это уже другой вопрос.

Suren
Offline
Зарегистрирован: 19.12.2017

b707 пишет:

Сурен, вы два года назад уже спрашивали почти то же самое - и я вам тогда отвечал. Что, неужели за 2 года вы ничему не научились ?

http://arduino.ru/forum/programmirovanie/kak-peredat-znachenie-ne-tekst-cherez-433mhz-moduli-dlya-arduino

Это было не LoRa. тот вопрос решился.Спасибо Вам.

b707
Онлайн
Зарегистрирован: 26.05.2017

Suren пишет:

Я не сказал делайте за меня,я сказал подскажите.А если, ко всем уважением, Вам жалко делится знаниями,то это уже другой вопрос.

вам уже столько подсказали - и через парсинг, и через биты. и через структуру... Проблема в том, что с вами разговор, как с глухим - вы ничего из этих слов не понимаете. Это уже не "подскажите", а "сделайте за меня"

 

v258
Offline
Зарегистрирован: 25.05.2020

Никто за вас не станет писать код, прошивать его в две лоры и проверять за вас. Советов вам здесь уже надавали достаточно. Вы ждете, когда вам дадут именно код?

b707
Онлайн
Зарегистрирован: 26.05.2017

Suren пишет:

Это было не LoRa. тот вопрос решился.Спасибо Вам.

это просто смешно, ваш нынешний вопрос не имеет никакого отношения к Лоре. Вы не знаете элементарных вещей - как получить из Монитора строчку и разбить ее на части.

при чем тут лора вообще...

b707
Онлайн
Зарегистрирован: 26.05.2017

v258 пишет:

Вы ждете, когда вам дадут именно код?

конечно.

Два года назад было тоже самое - "вопрос решился", когда ТС получил готовый кусок кода.  И, естесственно, абсолютно ничего не понял и ничему не научился.

Я на этом сваливаю из темы. Советов, что тут уже надавали - хватитт на три программы

 

v258
Offline
Зарегистрирован: 25.05.2020

В этот раз ему не повезло ))

Suren
Offline
Зарегистрирован: 19.12.2017

Спасибо всем.