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

Тема в разделе "Проводная и беспроводная связь", создана пользователем cd1room, 9 июл 2021.

  1. cd1room

    cd1room Нуб

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

    это приемник

    #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);
    }
    }
     
  2. cd1room

    cd1room Нуб

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

    Вложения:

  3. Igor68

    Igor68 Гуру

    Доброго времени суток!
    Простите, но RS485 и Modbus это не одно и то же. В первом случае интерфейс, а в другом протокол обмена.
    Я понимаю, что Вы пытаетесь на основе протокола сделать свой, или датчик с которым Вы работаете уже с Modbus RTU?
    И если не трудно приведите в порядок код, потому как сейчас жарко и не у каждого есть желание читать такое.
    Спасибо!
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Да чтож сегодня такое!!! Неужто жара?
    [​IMG]
     
  5. Igor68

    Igor68 Гуру

    Вот это Вы говорите:
    Данные я передаю в виде uint 16а точнее например: 3014 это 3м/с с направлением 14.
    хотите в uint16_t, тогда старшая часть (по маске 0xFF00) у вас скорость, а младшая (по маске 0x00FF) направление так?
    У Вас скорость и направления могут быть от 0 до 255 (0x00 до 0xFF) значит число для передачи:
    Код (C++):
    uint16_t val = (sk << 8) | nap;
    Верно? Тогда на приёме надо:
    Код (C++):
    uint8_t sk = (val >> 8);
    uint8_t nap = val & 0xFF;
    И val не должен быть более 0xFFFF; (он и не будет, потому как uint16_t... но когда формируете будет бардак). Кстати, а 30м/с это думаю 300, которые давно уже не 0xFF
    Проверьте, это так? Ну и в коде уточните.
     
  6. parovoZZ

    parovoZZ Гуру

    Принимай integer. Не вижу никакой проблемы.
     
  7. cd1room

    cd1room Нуб

    Всем спасибо.
    Проблема решена. Убрал цикл while. Ну и добавил LoRa.readString();
    Теперь сравнивается правильно. А это мне и нужно было.

    Код (C++):
    #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
     
      String rec;
      String recold;

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

     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);
           
           }
        recold=rec;
       
      }
     
      digitalWrite(LED_BUILTIN, LOW);
     
    }
     
  8. cd1room

    cd1room Нуб

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

    //скорость ветра 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 }
     
  9. Igor68

    Igor68 Гуру

    А Вы не желаете упаковать два параметра в один unt16_t? Насколько я понял направление и скорость. каковы значения (пределы) этих параметров. И если они параметры без знака, то почему не пользуетесь шестнадцатеричным представлением на уровне uint16 ?
    Код (C++):

    uint8_t sk; //скорость
    uint8_t np; //направление
    uint16_t tx_data;
    tx_data = (sk << 8) | np;
     
    я выше об этом говорил.
    А может я вообще не понял? Ну тогда простите!
     
    Последнее редактирование: 9 июл 2021
  10. cd1room

    cd1room Нуб

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