Modbus rs485 датчик направления ветра. LoRa передача параметров по радио каналу.

cd1room
Offline
Зарегистрирован: 09.07.2021

Приветствую всех жителей данного форума. Делаю устройство передающие данные о ветре из датчика ветра. Интерфейс датчик rs485 протокол modbus. На расстояние по радио каналу через LoRa. Плата у меня BSFrance Lora32u4 II v1.3. С микроконтроллером 32u4. Возникла проблема. Проблема следующая. Данные я передаю в виде uint 16а точнее например: 3014 это 3м/с с направлением 14.Передача происходит нормально но когда я их принимаю эти данные приходят в виде String причем по очереди. В общем мне надо чтобы данные были int для того чтобы я их мог сравнит с предыдущими данными. Мне нужно чтобы пришедшие данные если они такие же как предыдущие не выводились по uart приемника но если пришли данные и они отличаются от предыдущих то данные выводятся однократно в uart приёмника.

это передатчик с датчиком

 

#include <ModbusRtu.h>

#include <SPI.h>
#include <LoRa.h>
// uncomment the section corresponding to your board
// BSFrance 2017 contact@bsrance.fr 

#define TXEN  9 // Arduino контакт RE-DE RS485 микросхемме

//  //LoR32u4 433MHz V1.0 (white board)
//  #define SCK     15
//  #define MISO    14
//  #define MOSI    16
//  #define SS      1
//  #define RST     4
//  #define DI0     7
//  #define BAND    433E6 
//  #define PABOOST true

//  //LoR32u4 433MHz V1.2 (white board)
//  #define SCK     15
//  #define MISO    14
//  #define MOSI    16
//  #define SS      8
//  #define RST     4
//  #define DI0     7
//  #define BAND    433E6 
//  #define PABOOST true 

  //LoR32u4II 868MHz or 915MHz (black board)
  #define SCK     15
  #define MISO    14
  #define MOSI    16
  #define SS      8
  #define RST     4
  #define DI0     7
  #define BAND    868E6  // 915E6
  #define PABOOST true 

uint16_t tx_data;
uint8_t new_data;
int counter = 0;
uint16_t OUTTEXT=0;
uint16_t au16data[16]; //!< массив данных для обмена по modbus
uint8_t u8state; //!< флаг состояние
uint8_t u8query; //!< флаг принятого сообщения
uint8_t u8txenpin = 1; // разрешает пин TXEN
/**
 *  Объявление объекта Modbus
 *  u8id : узел id = 0 для master, = 1..247 для slave
 *  port : serial port
 *  u8txenpin : 0 для RS-232 и USB-FTDI 
 *               или любая цифра отличная от 0 > 1 для RS-485
 */
Modbus master(0,Serial1,TXEN); // this is master and RS-232 or USB-FTDI

/**
 * Это структура, которая содержит запрос к подчиненному устройству
 */
modbus_t telegram[1];

unsigned long u32wait;

void setup() {
  // telegram 0: регистры чтения
  telegram[0].u8id = 138; // slave адрес последняя цифра сериного номера плюс 130
  telegram[0].u8fct = 3; // регистр приема
  telegram[0].u16RegAdd = 0; // адрес начала чтения
  telegram[0].u16CoilsNo = 7; // количество байт для чтения
  telegram[0].au16reg = au16data; // массив данных

  
 
 LoRa.setPins(SS,RST,DI0);
  if (!LoRa.begin(BAND,PABOOST)) {
    
 digitalWrite(LED_BUILTIN, HIGH);
 delay(2000);
 digitalWrite(LED_BUILTIN,LOW);
  }

  
  Serial1.begin( 19200 ); // скорость порта 19200
  master.start();
  master.setTimeOut( 1000 ); // если нет ответа 5000 мсек ошибка
  u32wait = millis() + 100;
  u8state = u8query = 0; 
}

void loop() 
{
  
  digitalWrite(LED_BUILTIN, HIGH);
 
   master.query( telegram[u8query] ); // отправить запрос только один раз
   delay(100);
     master.poll(); // проверяем ответное сообщение
  
 

 
//скорость ветра 0.5-1м/с
   if(au16data[0] >= 4 && au16data[0] <= 10) {
    //0-30град 0-1час
      if(au16data[1] >= 0 && au16data[1] <= 30){
         tx_data = 510;
      }
    //31-60град 1-2час 
       if(au16data[1] >= 31 && au16data[1] <= 60){
         tx_data = 511;
      
      }
    //61-90град 2-3час
      if(au16data[1] >= 61 && au16data[1] <= 90){
         tx_data = 512;
      }
    //91-120град 3-4час
      if(au16data[1] >= 91 && au16data[1] <= 120){
        tx_data = 513;
      }
    //121-150град 4-5час
      if(au16data[1] >= 121 && au16data[1] <= 150){
        tx_data = 514;
      }
    //151-180град 5-6час
      if(au16data[1] >= 151 && au16data[1] <= 180){
        tx_data = 515;
      }
    //181-210град 6-7час
      if(au16data[1] >= 181 && au16data[1] <= 210){
         tx_data = 516;
      }
    //211-240град 7-8час
      if(au16data[1] >= 211 && au16data[1] <= 240){
         tx_data = 517;      
      }
    //241-270град 8-9час
      if(au16data[1] >= 241 && au16data[1] <= 270){
         tx_data = 518;
      }
    //271-300град 9-10час
      if(au16data[1] >= 271 && au16data[1] <= 300){
        tx_data = 519;
      }
    //301-330град 10-11час
      if(au16data[1] >= 301 && au16data[1] <= 330){
        tx_data = 520;
      }      
    //330-360град 11-12час
      if(au16data[1] >= 331 && au16data[1] <= 360){
        tx_data = 521;
      }      
      
     LoRa.beginPacket();
     LoRa.print(tx_data);    
     LoRa.endPacket();
      
       digitalWrite(LED_BUILTIN, LOW);
        delay(50);
  
    }

//скорость ветра 1-1.5м/с
   if(au16data[0] >= 11 && au16data[0] <= 15) {
    //0-30град 0-1час
      if(au16data[1] >= 0 && au16data[1] <= 30){
         tx_data = 1010;
      }
    //31-60град 1-2час 
       if(au16data[1] >= 31 && au16data[1] <= 60){
         tx_data = 1011;
      
      }
    //61-90град 2-3час
      if(au16data[1] >= 61 && au16data[1] <= 90){
         tx_data = 1012;
      }
    //91-120град 3-4час
      if(au16data[1] >= 91 && au16data[1] <= 120){
        tx_data = 1013;
      }
    //121-150град 4-5час
      if(au16data[1] >= 121 && au16data[1] <= 150){
        tx_data = 1014;
      }
    //151-180град 5-6час
      if(au16data[1] >= 151 && au16data[1] <= 180){
        tx_data = 1015;
      }
    //181-210град 6-7час
      if(au16data[1] >= 181 && au16data[1] <= 210){
         tx_data = 1016;
      }
    //211-240град 7-8час
      if(au16data[1] >= 211 && au16data[1] <= 240){
         tx_data = 1017;      
      }
    //241-270град 8-9час
      if(au16data[1] >= 241 && au16data[1] <= 270){
         tx_data = 1018;
      }
    //271-300град 9-10час
      if(au16data[1] >= 271 && au16data[1] <= 300){
        tx_data = 1019;
      }
    //301-330град 10-11час
      if(au16data[1] >= 301 && au16data[1] <= 330){
        tx_data = 1020;
      }      
    //330-360град 11-12час
      if(au16data[1] >= 331 && au16data[1] <= 360){
        tx_data = 1021;
      }      
      
     LoRa.beginPacket();
     LoRa.print(tx_data);    
     LoRa.endPacket();
      
       digitalWrite(LED_BUILTIN, LOW);
        delay(50);
  
    }

//скорость ветра 1.5-2м/с
   if(au16data[0] >= 16 && au16data[0] <= 20) {
    //0-30град 0-1час
      if(au16data[1] >= 0 && au16data[1] <= 30){
         tx_data = 1510;
      }
    //31-60град 1-2час 
       if(au16data[1] >= 31 && au16data[1] <= 60){
         tx_data = 1511;
      
      }
    //61-90град 2-3час
      if(au16data[1] >= 61 && au16data[1] <= 90){
         tx_data = 1512;
      }
    //91-120град 3-4час
      if(au16data[1] >= 91 && au16data[1] <= 120){
        tx_data = 1513;
      }
    //121-150град 4-5час
      if(au16data[1] >= 121 && au16data[1] <= 150){
        tx_data = 1514;
      }
    //151-180град 5-6час
      if(au16data[1] >= 151 && au16data[1] <= 180){
        tx_data = 1515;
      }
    //181-210град 6-7час
      if(au16data[1] >= 181 && au16data[1] <= 210){
         tx_data = 1516;
      }
    //211-240град 7-8час
      if(au16data[1] >= 211 && au16data[1] <= 240){
         tx_data = 1517;      
      }
    //241-270град 8-9час
      if(au16data[1] >= 241 && au16data[1] <= 270){
         tx_data = 1518;
      }
    //271-300град 9-10час
      if(au16data[1] >= 271 && au16data[1] <= 300){
        tx_data = 1519;
      }
    //301-330град 10-11час
      if(au16data[1] >= 301 && au16data[1] <= 330){
        tx_data = 1520;
      }      
    //330-360град 11-12час
      if(au16data[1] >= 331 && au16data[1] <= 360){
        tx_data = 1521;
      }      
      
     LoRa.beginPacket();
     LoRa.print(tx_data);    
     LoRa.endPacket();
      
       digitalWrite(LED_BUILTIN, LOW);
        delay(50);
  
    }

//скорость ветра 2-2.5м/с
   if(au16data[0] >= 21 && au16data[0] <= 25) {
    //0-30град 0-1час
      if(au16data[1] >= 0 && au16data[1] <= 30){
         tx_data = 2010;
      }
    //31-60град 1-2час 
       if(au16data[1] >= 31 && au16data[1] <= 60){
         tx_data = 2011;
      
      }
    //61-90град 2-3час
      if(au16data[1] >= 61 && au16data[1] <= 90){
         tx_data = 2012;
      }
    //91-120град 3-4час
      if(au16data[1] >= 91 && au16data[1] <= 120){
        tx_data = 2013;
      }
    //121-150град 4-5час
      if(au16data[1] >= 121 && au16data[1] <= 150){
        tx_data = 2014;
      }
    //151-180град 5-6час
      if(au16data[1] >= 151 && au16data[1] <= 180){
        tx_data = 2015;
      }
    //181-210град 6-7час
      if(au16data[1] >= 181 && au16data[1] <= 210){
         tx_data = 2016;
      }
    //211-240град 7-8час
      if(au16data[1] >= 211 && au16data[1] <= 240){
         tx_data = 2017;      
      }
    //241-270град 8-9час
      if(au16data[1] >= 241 && au16data[1] <= 270){
         tx_data = 2018;
      }
    //271-300град 9-10час
      if(au16data[1] >= 271 && au16data[1] <= 300){
        tx_data = 2019;
      }
    //301-330град 10-11час
      if(au16data[1] >= 301 && au16data[1] <= 330){
        tx_data = 2020;
      }      
    //330-360град 11-12час
      if(au16data[1] >= 331 && au16data[1] <= 360){
        tx_data = 2021;
      }      
      
     LoRa.beginPacket();
     LoRa.print(tx_data);    
     LoRa.endPacket();
      
       digitalWrite(LED_BUILTIN, LOW);
        delay(50);
  
    }

//скорость ветра 2.5-3м/с
   if(au16data[0] >= 26 && au16data[0] <= 30) {
    //0-30град 0-1час
      if(au16data[1] >= 0 && au16data[1] <= 30){
         tx_data = 2510;
      }
    //31-60град 1-2час 
       if(au16data[1] >= 31 && au16data[1] <= 60){
         tx_data = 2511;
      
      }
    //61-90град 2-3час
      if(au16data[1] >= 61 && au16data[1] <= 90){
         tx_data = 2512;
      }
    //91-120град 3-4час
      if(au16data[1] >= 91 && au16data[1] <= 120){
        tx_data = 2513;
      }
    //121-150град 4-5час
      if(au16data[1] >= 121 && au16data[1] <= 150){
        tx_data = 2514;
      }
    //151-180град 5-6час
      if(au16data[1] >= 151 && au16data[1] <= 180){
        tx_data = 2515;
      }
    //181-210град 6-7час
      if(au16data[1] >= 181 && au16data[1] <= 210){
         tx_data = 2516;
      }
    //211-240град 7-8час
      if(au16data[1] >= 211 && au16data[1] <= 240){
         tx_data = 2517;      
      }
    //241-270град 8-9час
      if(au16data[1] >= 241 && au16data[1] <= 270){
         tx_data = 2518;
      }
    //271-300град 9-10час
      if(au16data[1] >= 271 && au16data[1] <= 300){
        tx_data = 2519;
      }
    //301-330град 10-11час
      if(au16data[1] >= 301 && au16data[1] <= 330){
        tx_data = 2520;
      }      
    //330-360град 11-12час
      if(au16data[1] >= 331 && au16data[1] <= 360){
        tx_data = 2521;
      }      
      
     LoRa.beginPacket();
     LoRa.print(tx_data);    
     LoRa.endPacket();
      
       digitalWrite(LED_BUILTIN, LOW);
        delay(50);
  
    }

//скорость ветра 3-3.5м/с
   if(au16data[0] >= 31 && au16data[0] <= 35) {
    //0-30град 0-1час
      if(au16data[1] >= 0 && au16data[1] <= 30){
         tx_data = 3010;
      }
    //31-60град 1-2час 
       if(au16data[1] >= 31 && au16data[1] <= 60){
         tx_data = 3011;
      
      }
    //61-90град 2-3час
      if(au16data[1] >= 61 && au16data[1] <= 90){
         tx_data = 3012;
      }
    //91-120град 3-4час
      if(au16data[1] >= 91 && au16data[1] <= 120){
        tx_data = 3013;
      }
    //121-150град 4-5час
      if(au16data[1] >= 121 && au16data[1] <= 150){
        tx_data = 3014;
      }
    //151-180град 5-6час
      if(au16data[1] >= 151 && au16data[1] <= 180){
        tx_data = 3015;
      }
    //181-210град 6-7час
      if(au16data[1] >= 181 && au16data[1] <= 210){
         tx_data = 3016;
      }
    //211-240град 7-8час
      if(au16data[1] >= 211 && au16data[1] <= 240){
         tx_data = 3017;      
      }
    //241-270град 8-9час
      if(au16data[1] >= 241 && au16data[1] <= 270){
         tx_data = 3018;
      }
    //271-300град 9-10час
      if(au16data[1] >= 271 && au16data[1] <= 300){
        tx_data = 3019;
      }
    //301-330град 10-11час
      if(au16data[1] >= 301 && au16data[1] <= 330){
        tx_data = 3020;
      }      
    //330-360град 11-12час
      if(au16data[1] >= 331 && au16data[1] <= 360){
        tx_data = 3021;
      }      
      
     LoRa.beginPacket();
     LoRa.print(tx_data);    
     LoRa.endPacket();
      
       digitalWrite(LED_BUILTIN, LOW);
        delay(50);
  
    }
    
}

это приемник

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

// uncomment the section corresponding to your board
// BSFrance 2017 contact@bsrance.fr 

//  //LoR32u4 433MHz V1.0 (white board)
//  #define SCK     15
//  #define MISO    14
//  #define MOSI    16
//  #define SS      1
//  #define RST     4
//  #define DI0     7
//  #define BAND    433E6 
//  #define PABOOST true

//  //LoR32u4 433MHz V1.2 (white board)
//  #define SCK     15
//  #define MISO    14
//  #define MOSI    16
//  #define SS      8
//  #define RST     4
//  #define DI0     7
//  #define BAND    433E6 
//  #define PABOOST true 

  //LoR32u4II 868MHz or 915MHz (black board)
  #define SCK     15
  #define MISO    14
  #define MOSI    16
  #define SS      8
  #define RST     4
  #define DI0     7
  #define BAND    868E6  // 915E6
  #define PABOOST true
   
  char rec;

void setup() {
  
  Serial.begin(9600);
  Serial.println("LoRa Receiver");
  LoRa.setPins(SS,RST,DI0);
  if (!LoRa.begin(BAND,PABOOST )) {
  } 
  //error
}

void loop() {
  // try to parse packet
  int packetSize = LoRa.parsePacket();
  
  if (packetSize) {
    digitalWrite(LED_BUILTIN, HIGH);
    while (LoRa.available()) {
      rec = LoRa.read();
         
       delay(100);
     Serial.print(rec);
    }
     digitalWrite(LED_BUILTIN, LOW);
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

cd1room пишет:
Данные я передаю в виде uint 16а точнее например: 3014 это 3м/с с направлением 14.

Неправда. Нехорошо обманывать!

В строках №№ 155, 216, 277, 338, 398, 459 Вы передаёте число в виде символьной строки.

cd1room пишет:
когда я их принимаю эти данные приходят в виде String

Ну, правильно, как передаёте, так и приходят. А Вы чего ожидали?

cd1room пишет:
мне надо чтобы данные были int

Ну, если надо, так либо передавайте их как число, а не как строку, либо передавайте как передаёте, а на принимающей стороне преобразуйте из строки в число.

Если Вы не знаете как именно "передавать как число", подсказка - Ваш класс описан как

class LoRaClass : public Stream ...

а значит все методы типа print / println / write и т.п. у него точно такие же, как и у обычного Serial. Ну, а уж по последнему документации море, разберётесь.

cd1room
Offline
Зарегистрирован: 09.07.2021

Всем спасибо.

Проблема решена. Убрал цикл while. Ну и добавил LoRa.readString();

Теперь сравнивается правильно. А это мне и нужно было.

#include <SPI.h>
#include <LoRa.h>
#include "DFRobotDFPlayerMini.h"
DFRobotDFPlayerMini myDFPlayer;

// uncomment the section corresponding to your board
// BSFrance 2017 contact@bsrance.fr 

//  //LoR32u4 433MHz V1.0 (white board)
//  #define SCK     15
//  #define MISO    14
//  #define MOSI    16
//  #define SS      1
//  #define RST     4
//  #define DI0     7
//  #define BAND    433E6 
//  #define PABOOST true

//  //LoR32u4 433MHz V1.2 (white board)
//  #define SCK     15
//  #define MISO    14
//  #define MOSI    16
//  #define SS      8
//  #define RST     4
//  #define DI0     7
//  #define BAND    433E6 
//  #define PABOOST true 

  //LoR32u4II 868MHz or 915MHz (black board)
  #define SCK     15
  #define MISO    14
  #define MOSI    16
  #define SS      8
  #define RST     4
  #define DI0     7
  #define BAND    868E6  // 915E6
  #define PABOOST true
   
  String rec;
  String recold; 

void setup() {
  
    
  Serial.begin(9600);
  Serial1.begin (9600);   
   myDFPlayer.volume(25); 
  
  LoRa.setPins(SS,RST,DI0);
  if (!LoRa.begin(BAND,PABOOST )) {
  } 
  //error
}

void loop() {
  // try to parse packet
  int packetSize = LoRa.parsePacket();
  
  if (packetSize) {
    digitalWrite(LED_BUILTIN, HIGH);
    rec = LoRa.readString();
         
       delay(100);
       if(rec!=recold)
       {
         Serial.println(rec);
         if(rec=514){
          myDFPlayer.play(81);
          }
       }
    recold=rec;
     
  }
  
  digitalWrite(LED_BUILTIN, LOW);
  
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Понятно, т.е. решили пойти по пути передачи строк :-) Ну, в добрый путь.

cd1room
Offline
Зарегистрирован: 09.07.2021

Хорошо бы еще кто нибуть подсказал бы другой путь менее длинный код.

//скорость ветра 1-1.5м/с
164    if(au16data[0] >= 11 && au16data[0] <= 15) {
165     //0-30град 0-1час
166       if(au16data[1] >= 0 && au16data[1] <= 30){
167          tx_data = 1010;
168       }
169     //31-60град 1-2час
170        if(au16data[1] >= 31 && au16data[1] <= 60){
171          tx_data = 1011;
172       
173       }
174     //61-90град 2-3час
175       if(au16data[1] >= 61 && au16data[1] <= 90){
176          tx_data = 1012;
177       }
178     //91-120град 3-4час
179       if(au16data[1] >= 91 && au16data[1] <= 120){
180         tx_data = 1013;
181       }
182     //121-150град 4-5час
183       if(au16data[1] >= 121 && au16data[1] <= 150){
184         tx_data = 1014;
185       }
186     //151-180град 5-6час
187       if(au16data[1] >= 151 && au16data[1] <= 180){
188         tx_data = 1015;
189       }
190     //181-210град 6-7час
191       if(au16data[1] >= 181 && au16data[1] <= 210){
192          tx_data = 1016;
193       }
194     //211-240град 7-8час
195       if(au16data[1] >= 211 && au16data[1] <= 240){
196          tx_data = 1017;     
197       }
198     //241-270град 8-9час
199       if(au16data[1] >= 241 && au16data[1] <= 270){
200          tx_data = 1018;
201       }
202     //271-300град 9-10час
203       if(au16data[1] >= 271 && au16data[1] <= 300){
204         tx_data = 1019;
205       }
206     //301-330град 10-11час
207       if(au16data[1] >= 301 && au16data[1] <= 330){
208         tx_data = 1020;
209       }     
210     //330-360град 11-12час
211       if(au16data[1] >= 331 && au16data[1] <= 360){
212         tx_data = 1021;
213       }     

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

cd1room пишет:

Хорошо бы еще кто нибуть подсказал бы другой путь менее длинный код.

Вы выложили странный огрызок кода в котором даже баланс фигурных скобок не соблюдён. Да, к тому же выложили его не по правилам форума, в результате я не могу просто скопипастить его к себе (Вы же, вроде, раньше умели правильно выкладывать, что случилось?). Как Вам можно подсказать?

То, что я пока вижу можно сократить кардинально, только оно Вам действительно надо?

Тем более, что у Вас какой-то странный набор интервалов. Они неодинаковы. Первый - 31 (с 0 по 30 включительно) а все остальные по 30. 

 0 <= x <= 30  --- всего 31 значение
31 <= x <= 60 --- всего 30 значений
61 <= x <= 90 --- всего 30 значений
...

Так и должно быть? Или же это ошибка и нужны одинаковые интервалы? Например, 

 0 <= x < 30 --- всего 30 значений
30 <= x < 60 --- всего 30 значений
60 <= x < 90 --- всего 30 значений

Если второй вариант, то вся Ваша портянка может быть сведена к одной (прописью - ОДНОЙ) строке.

Pyotr
Offline
Зарегистрирован: 12.03.2014

ЕвгенийП пишет:

Понятно, т.е. решили пойти по пути передачи строк :-) Ну, в добрый путь.

Мне кажется ТС не видит разницы передать данные числом или строкой.

Почему не передать в одном байте скорость, во втором - направление ветра?

cd1room
Offline
Зарегистрирован: 09.07.2021

ЕвгенийП пишет:

cd1room пишет:

Хорошо бы еще кто нибуть подсказал бы другой путь менее длинный код.

Вы выложили странный огрызок кода в котором даже баланс фигурных скобок не соблюдён. Да, к тому же выложили его не по правилам форума, в результате я не могу просто скопипастить его к себе (Вы же, вроде, раньше умели правильно выкладывать, что случилось?). Как Вам можно подсказать?

То, что я пока вижу можно сократить кардинально, только оно Вам действительно надо?

Тем более, что у Вас какой-то странный набор интервалов. Они неодинаковы. Первый - 31 (с 0 по 30 включительно) а все остальные по 30. 

 0 <= x <= 30  --- всего 31 значение
31 <= x <= 60 --- всего 30 значений
61 <= x <= 90 --- всего 30 значений
...

Так и должно быть? Или же это ошибка и нужны одинаковые интервалы? Например, 

 0 <= x < 30 --- всего 30 значений
30 <= x < 60 --- всего 30 значений
60 <= x < 90 --- всего 30 значений

Если второй вариант, то вся Ваша портянка может быть сведена к одной (прописью - ОДНОЙ) строке.

 

Извеняюсь за столь странный кусок кода(делал с телефона).

сейчас постараюсь объяснить подробнее зачем все это надо.

Собственно мне нужно передать эти параметры на приемник. Итак я сделал для более простого понимания на приемнике.

В принципе разницы нет как передавать. Но на приемнике LoRa надо будет чтобы при определённом направлении и скорости проигрывался мп3 файл устройством dfplayer mini. Пределы направления ветра от 1 до 12 в часах то есть 1 это направление на один час. Скорость ветра от 0.5м/с до 10м/с с шагом 0.5м/с. Например на устройство приемник пришло 510 это значит что скорость 0.5 м/с направление 1 дальше по uart передаю в dfplayer mini воспроизвести файл 1 ну и так далее. Таких файлов 240. Каждый файл соответствует своему направлению и скорости. Надеюсь теперь более понятно.

cd1room
Offline
Зарегистрирован: 09.07.2021

Можно но мне надо чтобы если направление и скорость  изменились то звуковой файл  должен быть воспроизведен один раз.  Далее если направление и скорость не изменились не воспроизводить ничего. И по этому  я не вижу другого способа как сравнивать новые и старые значения.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ничего не понятно. Вы мой вопрос поняли? У Вас разные интервалы - все 30, а один - 31. Вы это понимаете? Вопрос был простой: это строго необходимо или подойдут и одинаковые?

Если подойдут и одинаковые, то эту Вашу байду можно одной строкой записать.

А про всё остальное мне неинтересно.

cd1room
Offline
Зарегистрирован: 09.07.2021

Интервалы одинаковые это просто я ошибся. это градусы. 360 градусов разделенные на 12 интервалов то есть 12 часов напрвалений.

sadman41
Offline
Зарегистрирован: 19.10.2016

20 скоростей и 12 направлений вообще в один байт упаковать наверно можно и на приёмнике использовать его в качестве ID трека для плеера.

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:
20 скоростей и 12 направлений вообще в один байт упаковать наверно можно и на приёмнике использовать его в качестве ID трека для плеера.

если число скоростей урезать до 16-ти - можно будет по 4 бита отвести на скорость и направление :) - будет красиво и удобно...

Только все это не для ТС - он даже о массивах не подозревает

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

b707 пишет:

sadman41 пишет:
20 скоростей и 12 направлений вообще в один байт упаковать наверно можно и на приёмнике использовать его в качестве ID трека для плеера.

если число скоростей урезать до 16-ти - можно будет по 4 бита отвести на скорость и направление :) - будет красиво и удобно...

На самом деле и 20*12 вполне укладываются в 240 значений. И еще 16 значений остается для всяких служебных сообщений. Так что даже урезать ничего не нужно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

cd1room пишет:

Интервалы одинаковые это просто я ошибся. это градусы. 360 градусов разделенные на 12 интервалов то есть 12 часов напрвалений.

Вот прямо сейчас, я хотел показать Вам как всю байду из #4 записать одной строкой, но ... Вы когда-нибудь вставите её нормально, чтобы я мог её просто к себе скопировать? Или Вы предлагаете мне копировать как есть и вручную убирать мусор из каждой строки? Если второе, то мне лень и я этого делать не буду. Если вставите, то скопирую и покажу как заменить.

Не создавайте на ровном проблем тем, кто хочет Вам помочь!

P.S. Отмазы типа "я с телефона" не канают. Я-то чем виноват, что Вы с телефона? Мне из-за этого вручную всё ковырять? Не умеете с телефона - вставляйте с пылесоса, но вставляйте нормально.

cd1room
Offline
Зарегистрирован: 09.07.2021

Если честно то я не понял как ещё правильно вставить. Просто весь код в первом сообщении. В том сообщении где я вставил кусок кода всего лишь кусок из первого сообщения. этот код я вставил для указания моей проблемы. Если есть какие то трудности с копированием из первого сообщения продублирую.

 

вот весь код

#include <ModbusRtu.h>

#include <SPI.h>
#include <LoRa.h>
// uncomment the section corresponding to your board
// BSFrance 2017 contact@bsrance.fr 

#define TXEN  9 // Arduino контакт RE-DE RS485 микросхемме

//  //LoR32u4 433MHz V1.0 (white board)
//  #define SCK     15
//  #define MISO    14
//  #define MOSI    16
//  #define SS      1
//  #define RST     4
//  #define DI0     7
//  #define BAND    433E6 
//  #define PABOOST true

//  //LoR32u4 433MHz V1.2 (white board)
//  #define SCK     15
//  #define MISO    14
//  #define MOSI    16
//  #define SS      8
//  #define RST     4
//  #define DI0     7
//  #define BAND    433E6 
//  #define PABOOST true 

  //LoR32u4II 868MHz or 915MHz (black board)
  #define SCK     15
  #define MISO    14
  #define MOSI    16
  #define SS      8
  #define RST     4
  #define DI0     7
  #define BAND    868E6  // 915E6
  #define PABOOST true 

uint16_t tx_data;
uint8_t new_data;
int counter = 0;
uint16_t OUTTEXT=0;
uint16_t au16data[16]; //!< массив данных для обмена по modbus
uint8_t u8state; //!< флаг состояние
uint8_t u8query; //!< флаг принятого сообщения
uint8_t u8txenpin = 1; // разрешает пин TXEN
/**
 *  Объявление объекта Modbus
 *  u8id : узел id = 0 для master, = 1..247 для slave
 *  port : serial port
 *  u8txenpin : 0 для RS-232 и USB-FTDI 
 *               или любая цифра отличная от 0 > 1 для RS-485
 */
Modbus master(0,Serial1,TXEN); // this is master and RS-232 or USB-FTDI

/**
 * Это структура, которая содержит запрос к подчиненному устройству
 */
modbus_t telegram[1];

unsigned long u32wait;

void setup() {
  // telegram 0: регистры чтения
  telegram[0].u8id = 138; // slave адрес последняя цифра сериного номера плюс 130
  telegram[0].u8fct = 3; // регистр приема
  telegram[0].u16RegAdd = 0; // адрес начала чтения
  telegram[0].u16CoilsNo = 7; // количество байт для чтения
  telegram[0].au16reg = au16data; // массив данных

  
 
 LoRa.setPins(SS,RST,DI0);
  if (!LoRa.begin(BAND,PABOOST)) {
    
 digitalWrite(LED_BUILTIN, HIGH);
 delay(2000);
 digitalWrite(LED_BUILTIN,LOW);
  }

  
  Serial1.begin( 19200 ); // скорость порта 19200
  master.start();
  master.setTimeOut( 1000 ); // если нет ответа 5000 мсек ошибка
  u32wait = millis() + 100;
  u8state = u8query = 0; 
}

void loop() 
{
  
  digitalWrite(LED_BUILTIN, HIGH);
 
   master.query( telegram[u8query] ); // отправить запрос только один раз
   delay(100);
     master.poll(); // проверяем ответное сообщение
  
 

 
//скорость ветра 0.5-1м/с
   if(au16data[0] >= 4 && au16data[0] <= 10) {
    //0-30град 0-1час
      if(au16data[1] >= 0 && au16data[1] <= 30){
         tx_data = 510;
      }
    //31-60град 1-2час 
       if(au16data[1] >= 31 && au16data[1] <= 60){
         tx_data = 511;
      
      }
    //61-90град 2-3час
      if(au16data[1] >= 61 && au16data[1] <= 90){
         tx_data = 512;
      }
    //91-120град 3-4час
      if(au16data[1] >= 91 && au16data[1] <= 120){
        tx_data = 513;
      }
    //121-150град 4-5час
      if(au16data[1] >= 121 && au16data[1] <= 150){
        tx_data = 514;
      }
    //151-180град 5-6час
      if(au16data[1] >= 151 && au16data[1] <= 180){
        tx_data = 515;
      }
    //181-210град 6-7час
      if(au16data[1] >= 181 && au16data[1] <= 210){
         tx_data = 516;
      }
    //211-240град 7-8час
      if(au16data[1] >= 211 && au16data[1] <= 240){
         tx_data = 517;      
      }
    //241-270град 8-9час
      if(au16data[1] >= 241 && au16data[1] <= 270){
         tx_data = 518;
      }
    //271-300град 9-10час
      if(au16data[1] >= 271 && au16data[1] <= 300){
        tx_data = 519;
      }
    //301-330град 10-11час
      if(au16data[1] >= 301 && au16data[1] <= 330){
        tx_data = 520;
      }      
    //330-360град 11-12час
      if(au16data[1] >= 331 && au16data[1] <= 360){
        tx_data = 521;
      }      
      
     LoRa.beginPacket();
     LoRa.print(tx_data);    
     LoRa.endPacket();
      
       digitalWrite(LED_BUILTIN, LOW);
        delay(50);
  
    }

//скорость ветра 1-1.5м/с
   if(au16data[0] >= 11 && au16data[0] <= 15) {
    //0-30град 0-1час
      if(au16data[1] >= 0 && au16data[1] <= 30){
         tx_data = 1010;
      }
    //31-60град 1-2час 
       if(au16data[1] >= 31 && au16data[1] <= 60){
         tx_data = 1011;
      
      }
    //61-90град 2-3час
      if(au16data[1] >= 61 && au16data[1] <= 90){
         tx_data = 1012;
      }
    //91-120град 3-4час
      if(au16data[1] >= 91 && au16data[1] <= 120){
        tx_data = 1013;
      }
    //121-150град 4-5час
      if(au16data[1] >= 121 && au16data[1] <= 150){
        tx_data = 1014;
      }
    //151-180град 5-6час
      if(au16data[1] >= 151 && au16data[1] <= 180){
        tx_data = 1015;
      }
    //181-210град 6-7час
      if(au16data[1] >= 181 && au16data[1] <= 210){
         tx_data = 1016;
      }
    //211-240град 7-8час
      if(au16data[1] >= 211 && au16data[1] <= 240){
         tx_data = 1017;      
      }
    //241-270град 8-9час
      if(au16data[1] >= 241 && au16data[1] <= 270){
         tx_data = 1018;
      }
    //271-300град 9-10час
      if(au16data[1] >= 271 && au16data[1] <= 300){
        tx_data = 1019;
      }
    //301-330град 10-11час
      if(au16data[1] >= 301 && au16data[1] <= 330){
        tx_data = 1020;
      }      
    //330-360град 11-12час
      if(au16data[1] >= 331 && au16data[1] <= 360){
        tx_data = 1021;
      }      
      
     LoRa.beginPacket();
     LoRa.print(tx_data);    
     LoRa.endPacket();
      
       digitalWrite(LED_BUILTIN, LOW);
        delay(50);
  
    }

//скорость ветра 1.5-2м/с
   if(au16data[0] >= 16 && au16data[0] <= 20) {
    //0-30град 0-1час
      if(au16data[1] >= 0 && au16data[1] <= 30){
         tx_data = 1510;
      }
    //31-60град 1-2час 
       if(au16data[1] >= 31 && au16data[1] <= 60){
         tx_data = 1511;
      
      }
    //61-90град 2-3час
      if(au16data[1] >= 61 && au16data[1] <= 90){
         tx_data = 1512;
      }
    //91-120град 3-4час
      if(au16data[1] >= 91 && au16data[1] <= 120){
        tx_data = 1513;
      }
    //121-150град 4-5час
      if(au16data[1] >= 121 && au16data[1] <= 150){
        tx_data = 1514;
      }
    //151-180град 5-6час
      if(au16data[1] >= 151 && au16data[1] <= 180){
        tx_data = 1515;
      }
    //181-210град 6-7час
      if(au16data[1] >= 181 && au16data[1] <= 210){
         tx_data = 1516;
      }
    //211-240град 7-8час
      if(au16data[1] >= 211 && au16data[1] <= 240){
         tx_data = 1517;      
      }
    //241-270град 8-9час
      if(au16data[1] >= 241 && au16data[1] <= 270){
         tx_data = 1518;
      }
    //271-300град 9-10час
      if(au16data[1] >= 271 && au16data[1] <= 300){
        tx_data = 1519;
      }
    //301-330град 10-11час
      if(au16data[1] >= 301 && au16data[1] <= 330){
        tx_data = 1520;
      }      
    //330-360град 11-12час
      if(au16data[1] >= 331 && au16data[1] <= 360){
        tx_data = 1521;
      }      
      
     LoRa.beginPacket();
     LoRa.print(tx_data);    
     LoRa.endPacket();
      
       digitalWrite(LED_BUILTIN, LOW);
        delay(50);
  
    }

//скорость ветра 2-2.5м/с
   if(au16data[0] >= 21 && au16data[0] <= 25) {
    //0-30град 0-1час
      if(au16data[1] >= 0 && au16data[1] <= 30){
         tx_data = 2010;
      }
    //31-60град 1-2час 
       if(au16data[1] >= 31 && au16data[1] <= 60){
         tx_data = 2011;
      
      }
    //61-90град 2-3час
      if(au16data[1] >= 61 && au16data[1] <= 90){
         tx_data = 2012;
      }
    //91-120град 3-4час
      if(au16data[1] >= 91 && au16data[1] <= 120){
        tx_data = 2013;
      }
    //121-150град 4-5час
      if(au16data[1] >= 121 && au16data[1] <= 150){
        tx_data = 2014;
      }
    //151-180град 5-6час
      if(au16data[1] >= 151 && au16data[1] <= 180){
        tx_data = 2015;
      }
    //181-210град 6-7час
      if(au16data[1] >= 181 && au16data[1] <= 210){
         tx_data = 2016;
      }
    //211-240град 7-8час
      if(au16data[1] >= 211 && au16data[1] <= 240){
         tx_data = 2017;      
      }
    //241-270град 8-9час
      if(au16data[1] >= 241 && au16data[1] <= 270){
         tx_data = 2018;
      }
    //271-300град 9-10час
      if(au16data[1] >= 271 && au16data[1] <= 300){
        tx_data = 2019;
      }
    //301-330град 10-11час
      if(au16data[1] >= 301 && au16data[1] <= 330){
        tx_data = 2020;
      }      
    //330-360град 11-12час
      if(au16data[1] >= 331 && au16data[1] <= 360){
        tx_data = 2021;
      }      
      
     LoRa.beginPacket();
     LoRa.print(tx_data);    
     LoRa.endPacket();
      
       digitalWrite(LED_BUILTIN, LOW);
        delay(50);
  
    }

//скорость ветра 2.5-3м/с
   if(au16data[0] >= 26 && au16data[0] <= 30) {
    //0-30град 0-1час
      if(au16data[1] >= 0 && au16data[1] <= 30){
         tx_data = 2510;
      }
    //31-60град 1-2час 
       if(au16data[1] >= 31 && au16data[1] <= 60){
         tx_data = 2511;
      
      }
    //61-90град 2-3час
      if(au16data[1] >= 61 && au16data[1] <= 90){
         tx_data = 2512;
      }
    //91-120град 3-4час
      if(au16data[1] >= 91 && au16data[1] <= 120){
        tx_data = 2513;
      }
    //121-150град 4-5час
      if(au16data[1] >= 121 && au16data[1] <= 150){
        tx_data = 2514;
      }
    //151-180град 5-6час
      if(au16data[1] >= 151 && au16data[1] <= 180){
        tx_data = 2515;
      }
    //181-210град 6-7час
      if(au16data[1] >= 181 && au16data[1] <= 210){
         tx_data = 2516;
      }
    //211-240град 7-8час
      if(au16data[1] >= 211 && au16data[1] <= 240){
         tx_data = 2517;      
      }
    //241-270град 8-9час
      if(au16data[1] >= 241 && au16data[1] <= 270){
         tx_data = 2518;
      }
    //271-300град 9-10час
      if(au16data[1] >= 271 && au16data[1] <= 300){
        tx_data = 2519;
      }
    //301-330град 10-11час
      if(au16data[1] >= 301 && au16data[1] <= 330){
        tx_data = 2520;
      }      
    //330-360град 11-12час
      if(au16data[1] >= 331 && au16data[1] <= 360){
        tx_data = 2521;
      }      
      
     LoRa.beginPacket();
     LoRa.print(tx_data);    
     LoRa.endPacket();
      
       digitalWrite(LED_BUILTIN, LOW);
        delay(50);
  
    }

//скорость ветра 3-3.5м/с
   if(au16data[0] >= 31 && au16data[0] <= 35) {
    //0-30град 0-1час
      if(au16data[1] >= 0 && au16data[1] <= 30){
         tx_data = 3010;
      }
    //31-60град 1-2час 
       if(au16data[1] >= 31 && au16data[1] <= 60){
         tx_data = 3011;
      
      }
    //61-90град 2-3час
      if(au16data[1] >= 61 && au16data[1] <= 90){
         tx_data = 3012;
      }
    //91-120град 3-4час
      if(au16data[1] >= 91 && au16data[1] <= 120){
        tx_data = 3013;
      }
    //121-150град 4-5час
      if(au16data[1] >= 121 && au16data[1] <= 150){
        tx_data = 3014;
      }
    //151-180град 5-6час
      if(au16data[1] >= 151 && au16data[1] <= 180){
        tx_data = 3015;
      }
    //181-210град 6-7час
      if(au16data[1] >= 181 && au16data[1] <= 210){
         tx_data = 3016;
      }
    //211-240град 7-8час
      if(au16data[1] >= 211 && au16data[1] <= 240){
         tx_data = 3017;      
      }
    //241-270град 8-9час
      if(au16data[1] >= 241 && au16data[1] <= 270){
         tx_data = 3018;
      }
    //271-300град 9-10час
      if(au16data[1] >= 271 && au16data[1] <= 300){
        tx_data = 3019;
      }
    //301-330град 10-11час
      if(au16data[1] >= 301 && au16data[1] <= 330){
        tx_data = 3020;
      }      
    //330-360град 11-12час
      if(au16data[1] >= 331 && au16data[1] <= 360){
        tx_data = 3021;
      }      
      
     LoRa.beginPacket();
     LoRa.print(tx_data);    
     LoRa.endPacket();
      
       digitalWrite(LED_BUILTIN, LOW);
        delay(50);
  
    }
    
}

вот один блок

 

 

//скорость ветра 0.5-1м/с
   if(au16data[0] >= 4 && au16data[0] <= 10) {
    //0-30град 0-1час
      if(au16data[1] >= 0 && au16data[1] <= 30){
         tx_data = 510;
      }
    //31-60град 1-2час 
       if(au16data[1] >= 31 && au16data[1] <= 60){
         tx_data = 511;
      
      }
    //61-90град 2-3час
      if(au16data[1] >= 61 && au16data[1] <= 90){
         tx_data = 512;
      }
    //91-120град 3-4час
      if(au16data[1] >= 91 && au16data[1] <= 120){
        tx_data = 513;
      }
    //121-150град 4-5час
      if(au16data[1] >= 121 && au16data[1] <= 150){
        tx_data = 514;
      }
    //151-180град 5-6час
      if(au16data[1] >= 151 && au16data[1] <= 180){
        tx_data = 515;
      }
    //181-210град 6-7час
      if(au16data[1] >= 181 && au16data[1] <= 210){
         tx_data = 516;
      }
    //211-240град 7-8час
      if(au16data[1] >= 211 && au16data[1] <= 240){
         tx_data = 517;      
      }
    //241-270град 8-9час
      if(au16data[1] >= 241 && au16data[1] <= 270){
         tx_data = 518;
      }
    //271-300град 9-10час
      if(au16data[1] >= 271 && au16data[1] <= 300){
        tx_data = 519;
      }
    //301-330град 10-11час
      if(au16data[1] >= 301 && au16data[1] <= 330){
        tx_data = 520;
      }      
    //330-360град 11-12час
      if(au16data[1] >= 331 && au16data[1] <= 360){
        tx_data = 521;
      }      
      
     LoRa.beginPacket();
     LoRa.print(tx_data);    
     LoRa.endPacket();
      
       digitalWrite(LED_BUILTIN, LOW);
        delay(50);
  
    }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

cd1room пишет:

Если честно то я не понял как ещё правильно вставить. Просто весь код в первом сообщении. 

Если честно, я отвечаю на вопрос из сообщения #4 и меня интересует код оттуда.

Я вижу, что Вы поправили интервалы не так, как писал в #5, а зачем-то сделали их с 1. Неясно зачем, в программировании гораздо удобнее делать с 0. Этими 1-цами Вы отрезаете себе возможности краткой записи. Всегда делайте с нуля. Единицы можно, на худой конец один раз к результату прибавить или вычесть.

Так, вот, если сделать интервалы с нуля (как у меня в коде ниже), то вся эта байда (вся целиком)

      if(au16data[1] >= 0 && au16data[1] < 30){
         tx_data = 510;
      }
       if(au16data[1] >=30 && au16data[1] < 60){
         tx_data = 511;
      
      }
      if(au16data[1] >=60 && au16data[1] < 90){
         tx_data = 512;
      }
      if(au16data[1] >=90 && au16data[1] < 120){
        tx_data = 513;
      }
      if(au16data[1] >=120 && au16data[1] < 150){
        tx_data = 514;
      }
      if(au16data[1] >=150 && au16data[1] < 180){
        tx_data = 515;
      }
      if(au16data[1] >=180 && au16data[1] < 210){
         tx_data = 516;
      }
      if(au16data[1] >=210 && au16data[1] < 240){
         tx_data = 517;      
      }
      if(au16data[1] >=240 && au16data[1] < 270){
         tx_data = 518;
      }
      if(au16data[1] >=270 && au16data[1] < 300){
        tx_data = 519;
      }
      if(au16data[1] >=300 && au16data[1] < 330){
        tx_data = 520;
      }      
      if(au16data[1] >=330 && au16data[1] < 360){
        tx_data = 521;
      }       

может быть заменена на единственную строчку

tx_data = au16data[1] / 30 + 510;

Посмотрите и убедитесь сами, что это эквивалентно.

Тут, разве что, не хватает проверки, что au16data[1] не превышает 360. Но, если такая проверка нужна (часто она не нужна в силу природы этих данных), то её можно добавить - плюс ещё одна строка.

cd1room
Offline
Зарегистрирован: 09.07.2021

Теперь понял. Спасибо.

Код работает отлично. Больше 360 не может быть так как это считывается с помощью библиотеки modbus.

 И еще это заложено производителем.

Может еще подскажите как упростить на стороне приемника?

в общем мне надо преобразовать приходящие

510 511 512 513 514 515 516 517 518 519 520 521

1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021

.............

..............

5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021

 

 

сопоставить с

0001 0002 0003 0004 0005 0006 ...... 0239 0240

например  преобразовать

510 в 0001

511 в 0002

ну и так далее 240 значений

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Не проще ли файлам дать имена 510, 511...

cd1room
Offline
Зарегистрирован: 09.07.2021

sadman41 пишет:
Не проще ли файлам дать имена 510, 511...

Файлам можно но dfplayer работает с файлами 0001 0002.

 

cd1room
Offline
Зарегистрирован: 09.07.2021

Немного ошибся. Даже не в 0001 0002 надо а в 1 2 3 4...... 240.

На DFplayer отправляю команду myDFPlayer.play(52) что означает воспроизвести файл 0052

cd1room
Offline
Зарегистрирован: 09.07.2021

Вот мой код

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

#include "DFRobotDFPlayerMini.h"

DFRobotDFPlayerMini myDFPlayer;



// uncomment the section corresponding to your board
// BSFrance 2017 contact@bsrance.fr 

//  //LoR32u4 433MHz V1.0 (white board)
//  #define SCK     15
//  #define MISO    14
//  #define MOSI    16
//  #define SS      1
//  #define RST     4
//  #define DI0     7
//  #define BAND    433E6 
//  #define PABOOST true

//  //LoR32u4 433MHz V1.2 (white board)
//  #define SCK     15
//  #define MISO    14
//  #define MOSI    16
//  #define SS      8
//  #define RST     4
//  #define DI0     7
//  #define BAND    433E6 
//  #define PABOOST true 

  //LoR32u4II 868MHz or 915MHz (black board)
  #define SCK     15
  #define MISO    14
  #define MOSI    16
  #define SS      8
  #define RST     4
  #define DI0     7
  #define BAND    868E6  // 915E6
  #define PABOOST true
   
  String rec;
  String recold; 

void setup() 
{
  
    
  Serial.begin(9600);
  Serial1.begin(9600);
  myDFPlayer.begin(Serial1);
  LoRa.setPins(SS,RST,DI0);
  if (!LoRa.begin(BAND,PABOOST )) 
  {

  } 
  delay(2000);
  myDFPlayer.volume(25);
  delay(200);
  myDFPlayer.disableLoop();
      delay(200);
      myDFPlayer.play(1);
   
}

void loop() {
  // try to parse packet
  int packetSize = LoRa.parsePacket();

  if (packetSize) {
    digitalWrite(LED_BUILTIN, HIGH);
    rec = LoRa.readString();
         
      Serial.println(rec);
       delay(100);
       if(rec!=recold)
       
       
       {
         
         if(rec=="514")
         {
          myDFPlayer.play(5);
          Serial.println(rec);
          delay(2000);
          
         }
         if(rec=="515")
         {
          myDFPlayer.play(6);
          Serial.println(rec);
          delay(2000);
          
         }
         if(rec=="516")
         {
          myDFPlayer.play(7);
          Serial.println(rec);
          delay(2000);
          
         }



         
       }
    recold=rec;
     
  }
  
  digitalWrite(LED_BUILTIN, LOW);
  
}

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Да, есть у dfplayer такая болезнь.

Не знаю, какую цель преследуете, пересылая данные в такой форме, но я бы, как и писал выше, попытался упаковать значение метрики так, чтобы она сразу конвертировалась в номер трека.

В противном случае остается только хранить массив со значениями метрики и бегать по нему, определяя соответствующий значению индекс, который и будет номером трека.

cd1room
Offline
Зарегистрирован: 09.07.2021

Цель проста. Не запутаться.

Для лучшего понимания при отладке и написании программы.

Потому как мне код видеться объемным. 

Не профессионалам простые вещи кажутся сложными а сложные простыми.

Pyotr
Offline
Зарегистрирован: 12.03.2014

cd1room пишет:

Теперь понял. Спасибо.

Код работает отлично. Больше 360 не может быть так как это считывается с помощью библиотеки modbus.

 И еще это заложено производителем.

Может еще подскажите как упростить на стороне приемника?

в общем мне надо преобразовать приходящие

510 511 512 513 514 515 516 517 518 519 520 521

1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021

.............

..............

5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021

 

 

сопоставить с

0001 0002 0003 0004 0005 0006 ...... 0239 0240

например  преобразовать

510 в 0001

511 в 0002

ну и так далее 240 значений

 

В строке 12 чисел, всего 10 строк. Получаем 120 значений? Так или я чего-то упустил?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

cd1room пишет:

например  преобразовать

510 в 0001

511 в 0002

ну и так далее 240 значений

Например, написать

... n - 509; // преобразовать 510->1; 511->2, ну и так далее.
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ЕвгенийП пишет:

Например, написать

... n - 509; // преобразовать 510->1; 511->2, ну и так далее.

Ты чо?  В его ПТУ вышшую математику не проходили.  Ему бы попроще чо. 

cd1room
Offline
Зарегистрирован: 09.07.2021

DetSimen пишет:

ЕвгенийП пишет:

Например, написать

... n - 509; // преобразовать 510->1; 511->2, ну и так далее.

Ты чо?  В его ПТУ вышшую математику не проходили.  Ему бы попроще чо. 

Ну вопервых я вас не оскорблял. Теперь перейдём на ты. Во вторых ты когда пишешь сообщение смотри куда пишешь. Я специально написал в песочницу потому как я не профессионально занимаюсь программированием. Это моё хобби. Вместо оскорблений лучше помог. Написал бы как эту задачу решить по интереснее. Сколь у тебя высших ? Наверное много. А за всё время научили только оскорблять и стебаться.

cd1room
Offline
Зарегистрирован: 09.07.2021

Всем кто помогал спасибо. Тему можно закрывать

Pyotr
Offline
Зарегистрирован: 12.03.2014

Ну вот обидели человека... А я хотел предложить решение в одну строку.

cd1room
Offline
Зарегистрирован: 09.07.2021

Да не. Не обидели.
Просто решил задачу. Но хотелось бы у видеть элегантное решение на будущее. Может оно кому ещё поможет.

Pyotr
Offline
Зарегистрирован: 12.03.2014

cd1room пишет:
Да не. Не обидели. Просто решил задачу. Но хотелось бы у видеть элегантное решение на будущее. Может оно кому ещё поможет.

#24 ответьте на мой вопрос. 120 всех значений или 240?

cd1room
Offline
Зарегистрирован: 09.07.2021

240

Pyotr
Offline
Зарегистрирован: 12.03.2014

Чет я туплю неподетски... Парни, ТС не хочет объяснять как из 10 строк по 12 чисел получается всего 240 чисел, может кто объяснит "на пальцах"?

sadman41
Offline
Зарегистрирован: 19.10.2016

Да у него там завязка на скорость ветра ещё. Видимо будет электронный боцман из ардуины, который говорит: "Ветер зюйд-зюйд-вест, три узла".

Pyotr
Offline
Зарегистрирован: 12.03.2014

sadman41 пишет:

Да у него там завязка на скорость ветра ещё. Видимо будет электронный боцман из ардуины, который говорит: "Ветер зюйд-зюйд-вест, три узла".

Направление у него в часах, как я понял. Всего 12 значений.

Скорость - 10 значений в 1/2 м/с. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Не 10 значений, а  "0.5м/с до 10м/с с шагом 0.5м/с."

Pyotr
Offline
Зарегистрирован: 12.03.2014

Глянул еще. У ТС скорость приходит в дм/с. 

5хх - <= 10 дм/с
10хх - <= 15 дм/с
....
....
50хх -
<= 55 дм/с

cd1room
Offline
Зарегистрирован: 09.07.2021

Извеняюсь что ввёл в заблуждение. Там оканчивается не 50xx-<=55 а то 100xx-<=100. Именно от 0.5 до 10м/с с шагом 0.5м/с

cd1room
Offline
Зарегистрирован: 09.07.2021

sadman41 пишет:

Да у него там завязка на скорость ветра ещё. Видимо будет электронный боцман из ардуины, который говорит: "Ветер зюйд-зюйд-вест, три узла".


Да вы угодали. Именно так.
Только направление в часах в зависимости куда направлен датчик.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

А я чот не въезжаю в цель. Вымпельный ветер озвучивать? Сейлить в одиночку? Просто интересно.

Pyotr
Offline
Зарегистрирован: 12.03.2014

cd1room пишет:

Может еще подскажите как упростить на стороне приемника?

в общем мне надо преобразовать приходящие

510 511 512 513 514 515 516 517 518 519 520 521

1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021

.............

..............

5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021

 

 

сопоставить с

0001 0002 0003 0004 0005 0006 ...... 0239 0240

например  преобразовать

510 в 0001

511 в 0002

ну и так далее 240 значений

 

word inVal; // приходящее значение 510-10021
word outVal= (inVal / 500 - 1) * 12 + inVal % 100 - 9;//порядковый номер приходящего значения 1-240

cd1room
Offline
Зарегистрирован: 09.07.2021

wdrakula пишет:

А я чот не въезжаю в цель. Вымпельный ветер озвучивать? Сейлить в одиночку? Просто интересно.


Не в даваясь в подробности. Это нужно спортсменам для тренировки. Им нужно оперативно знать ветер в нескольких точках. Но экран с данными не подходит. Нужен человек который озвучивал бы направление и скорость. А така как это нудная работа и человек может не туда посмотреть и не то назвать. Ну вообщем с этой работой легко справится тупая говорилка.

cd1room
Offline
Зарегистрирован: 09.07.2021

Pyotr пишет:

cd1room пишет:

Может еще подскажите как упростить на стороне приемника?

в общем мне надо преобразовать приходящие

510 511 512 513 514 515 516 517 518 519 520 521

1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021

.............

..............

5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021

 

 

сопоставить с

0001 0002 0003 0004 0005 0006 ...... 0239 0240

например  преобразовать

510 в 0001

511 в 0002

ну и так далее 240 значений

 

word inVal; // приходящее значение 510-10021
word outVal= (inVal / 500 - 1) * 12 + inVal % 100 - 9;//порядковый номер приходящего значения 1-240

Интересно. Будет время обязательно поробую. Огромное спасибо всем.

Plasteroid
Plasteroid аватар
Offline
Зарегистрирован: 15.07.2020

Есть прекрасная библиотека для работы с LoRa модулями  SX 12xx-LORA

В ней есть много примеров для многих случаев .Для вашего случая  возможно подойдет "LoRa_Structure_TX" и"LoRa_Structure_RX"

Из примера:

struct trackerPacket
{
  uint8_t trackerID[13];
  uint32_t txcount;
  float latitude;
  float longitude;
  uint16_t altitude;
  uint8_t satellites;
  uint16_t voltage;
  int8_t temperature;
};